Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Virtuall Key: Sound an/aus


Jakane - Di 04.09.12 12:22
Titel: Virtuall Key: Sound an/aus
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 - 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. :)


Jakane - 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.


Delete - Di 04.09.12 14:29

VK_VOLUME_DOWN 0xAE Volume Down
VK_VOLUME_MUTE 0xAD Volume Mute
VK_VOLUME_UP 0xAF Volume Up


Delete - 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 - 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:


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;


Delete - Mi 05.09.12 13:36

Das ist TOTAL umständlich!

Bei VISTA und WIN7 geht es besser so:


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;