Autor Beitrag
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Di 04.09.12 12:22 
Hallo Delphi Helfer :)

auf meiner Tastatur habe ich eine Sound an/aus Taste. Bin ich warscheinlich nicht die einzigste die sowas hat.
Für ein Programm würde ich gern diese Taste per Programmschalter an/aus machen wollen. Gibt es eine Möglichkeit dafür?

Oder kann man den Soundzustand irgendwie auslesen, damit ich den Anwender warnen kann?

Ist schlecht wenn der Sound aus ist und mein Programm ein Alarm geben will, der zwar vom Programm aus funktioniert, aber wegen Sound aus nicht hörbar ist...

Danke für die Hilfe :)
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 04.09.12 13:30 
Die Taste deaktivieren wird vermutlich schwierig werden - dazu müsstest du wohl am Treiber rumfummeln. Alternativ wäre ein Hook möglich (aber kein Keyboardhook, sondern ein irgendein anderer, ist mir grade entfallen). Und mit dem Hook kommt es dann stark darauf an, was das für eine Tastatur ist, bzw. ob Zusatzsoftware installiert ist, die deinen Hook ggf. ins Leere laufen lässt... Kurz: Das kann man afaik vergessen. ;-)

Lautstärke auslesen ist bestimmt möglich. Aber was nützt das, wenn die angeschlossenen Boxen aus sind? :?

Wenn der Warnton wirklich wichtig ist, dann muss entweder der Anwender dafür sorgen, dass Sound hörbar ist, oder du muss zusätzlich ein optisches Signal ausgeben. :)

_________________
We are, we were and will not be.
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Di 04.09.12 14:09 
optisches signal gibts auch, aber nicht wenn das programm im tray is xD

wie kann man die Lautstärke auslesen, vlt hilft mir das weiter.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 04.09.12 14:29 
VK_VOLUME_DOWN 0xAE Volume Down
VK_VOLUME_MUTE 0xAD Volume Mute
VK_VOLUME_UP 0xAF Volume Up
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 04.09.12 14:31 
user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
optisches signal gibts auch, aber nicht wenn das programm im tray is xD

wie kann man die Lautstärke auslesen, vlt hilft mir das weiter.



Optische Signale kann man trotzdem geben:
- ganzer Bildschirm
- Tastatur-LEDs: z. B. Shift-Lock

Lautstärke:
Falls es Dir nicht klar ist: Es kommt auf das Betriebssystem an!

IhkL,jaMa.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 04.09.12 23:01 
user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Oder kann man den Soundzustand irgendwie auslesen, damit ich den Anwender warnen kann?


Wenn das Lautsprecher-Icon unten rechts in der Taskleiste sichtbar ist, kann man den entsprechenden Text auslesen und auswerten.

Beispiel:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
procedure TMainform.Button1Click(Sender: TObject);
var
  wnd            : HWND;
  AnzahlIcons    : integer;
  Schleife       : integer;
  pID            : cardinal;
  hProg          : THandle;
  pAdr           : Pointer;
  Gelesen        : cardinal;
  AnzahlBytes    : integer;
  Buffer         : array [0..255of char;
begin
  // Fenster finden (Windows 7)
  wnd :=  FindWindow('Shell_TrayWnd'nil);
  wnd :=  FindWindowEx(wnd, 0'TrayNotifyWnd'nil);
  wnd :=  FindWindowEx(wnd, 0'SysPager'nil);
  wnd :=  FindWindowEx(wnd, 0'ToolbarWindow32'nil);

  if wnd <> 0 then
    begin
      // Anzahl der "Icons" ermitteln
      AnzahlIcons := SendMessage(wnd, TB_ButtonCount, 00);

      // Prozess ermitteln, der die TaskbarNotificationArea verwaltet, und öffnen.
      GetWindowThreadProcessID(wnd, @pID);

      hProg := OpenProcess(Process_VM_Operation
                             or Process_VM_Read
                             or Process_VM_Write,
                           false,
                           pID);

      // Speichergröße festlegen und im anderen Prozess den Speicher anfordern.
      AnzahlBytes := 255;       // sollte ausreichen

      pAdr := VirtualAllocEx(hProg,
                         nil,
                         AnzahlBytes,
                         MEM_Reserve
                           or MEM_Commit,
                         Page_ReadWrite);

      for Schleife := AnzahlIcons - 1 downto 0 do
        begin
          // Texte der "Icons" abfragen und aus dem anderen Prozess auslesen.
          SendMessage(wnd, TB_GetButtonText, Schleife, integer(pAdr));

          ReadProcessMemory(hProg,
                            pAdr,
                            @Buffer,
                            AnzahlBytes,
                            Gelesen);

          if Pos('Lautsprecher', Buffer) > 0 then
            if Pos('%', Buffer) > 0 then
              Label1.Caption := 'Soundausgabe aktiv.'
            else
              Label1.Caption := 'Soundausgabe nicht aktiv.';
        end;

      // aufräumen und Speicher freigeben
      VirtualFreeEx(hProg,
                    pAdr,
                    0,
                    MEM_Release);

      CloseHandle(hProg);
    end;
end;
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.09.12 13:36 
Das ist TOTAL umständlich!

Bei VISTA und WIN7 geht es besser so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function getmute:boolean;
begin
if endpointVolume = nil then Exit;
   endpointVolume.GetMute(result);
end;
.
.
.
cbMute.Checked:= GetMute;