[C#] Vk_Volume_* simulieren

Munro

Lt. Commander
Mitglied seit
02.06.2003
Beiträge
126
Renomée
0
Standort
Österreich
Hi!

Wieder einmal eine Frage zu einer Tastendrucksimulation.

Ich möchte gerne mit einem C# (zurzeit Konsolenprogramm) Programm die Lautstärke lauter/leiser machen bzw. muten.

Es gibt ja für Windows 2000/XP die Keycodes "VK_VOLUME_UP" usw., aber wie kann man die benutzen?

SendInput bzw. keybd_event mit den jeweiligen "Multimediakeycodes" zeigen keine Wirkung.

Code:
            INPUT[] input = new INPUT[2];
            input[0].type = 1;
            input[0].ki.wVk = 0xAD;  // Keycode für Windows 2000/XP: Volume Mute key
            input[0].ki.dwFlags = 0x00;

            input[1].type = 1;
            input[1].ki.wVk = 0xAD;
            input[1].ki.dwFlags = 0x02; // Keyup

            SendInput((uint)input.Length, input, Marshal.SizeOf(input[0]));

Hier sollte dann ja eigentlich der Ton abgeschaltet werden, aber es tut sich nichts :S (SendInput ist richtig per Platform Invoke eingebunden (die Tastenkombi "STRG-ALT-Ende" für Stop im Winamp geht, aber zB. VK_MEDIA_STOP geht nicht (also auf meiner Logitech Tastatur hält der Stopknopf Winamp an, aber über den simulierten Tastendruck mit SendInput gehts nicht ??? )

Weiss einer welche Funktionen man da benutzen muss, um auch mit diesen Keycodes arbeiten zu können?

Danke schon mal im vorraus.

lg, nixtreffen
 
Versuch mal den KeyUp separat zu senden. Also erst SendInput mit dem KeyDown, dann nochmal mit dem KeyUp.

/edit
So gehts bei mir:
Code:
			INPUT[] input = new INPUT[1];
			input[0].type = 1;
			input[0].ki.wVk = 0xAD;
			input[0].ki.dwFlags = 0x00; // Keydown

			SendInput((uint) input.Length, input, Marshal.SizeOf(input[0]));

			input[0].type = 1;
			input[0].ki.wVk = 0xAD;
			input[0].ki.dwFlags = 0x02; // Keyup

			SendInput((uint) input.Length, input, Marshal.SizeOf(input[0]));
Das mit dem KeyDown/KeyUp einzeln senden hab ich Dir übrigens glaube ich schon beim letzten Mal empfohlen. ;)
 
Das mit dem KeyDown/KeyUp einzeln senden hab ich Dir übrigens glaube ich schon beim letzten Mal empfohlen. ;)

Stimmt, aber bei den "normalen" Tasten funktionierts bei mir nun auch mit nur einem Aufruf (STRG-ALT-ENDE funktioniert als Array mit der Länge 6 ohne Probleme :) )


Also egal ob ich alles in 1 Array schreibe und SendInput einmal aufrufe oder eben Keydown und Keyup getrennt passiert immer dasselbe:

Eine Anwendung welche nur diesen Tastendruck (gleich beim starten) simuliert schaltet den Ton aus.
Gleiches passiert wenn ich meine Methode "VolumeMute" in der Klasse Kommandos am Beginn meines "PPCFernbedienungsServers" aufrufe.

Wenn ich jedoch mit dem Server warte bis eine TCP Verbindung vom PocketPc Client kommt und der danach das Signal zum "muten" schickt, wird die Methode aufgerufen (laut Returnwerten auch korrekt ausgeführt), aber der Ton bleibt an. Wenn ich den Server Zeile für Zeile debugge schaltet er den Ton aber auch ab ??? *noahnung*

Woran könnte das liegen?

Zum Server nochmal: Ich habe eine Klasse Kommandos gemacht und von dort werden die diversen Sachen halt aufgerufen, in der Main wird ein TCPListener gestartet und danach StreamReader und -Writer. Dann wird solange gewartet bis ein Kommando kommt und dann die Methode in "Kommandos" aufgerufen und der Server macht wieder ein "r.ReadString();"

:-/ *noahnung*

Aber auf jeden Fall wieder mal danke für deine Hilfe Tiku :-*
 
Hmm, bau mal spaßeshalber zwischen KeyDown und KeyUp eine Verzögerung von ein paar Millisekunden ein. Aber eigentlich kann es daran nicht liegen, zumal der Ton bei mir schon ausgeht, wenn ich auf meiner Multimediatastatur den Mute-Key runterdrücke, d. h. KeyDown sollte schon reichen.
Falls Du weißt wie man einen systemweiten(!) Tastaturhook (genauer: WH_KEYBOARD_LL) schreibt, könntest Du auch mal einen schreiben und damit prüfen, ob SendInput überhaupt die richtigen Nachrichten generiert. Im Grunde könntest Du damit sogar vergleichen was bei einem echten Tastendruck passiert und was bei einem simulierten.
 
Falls Du weißt wie man einen systemweiten(!) Tastaturhook (genauer: WH_KEYBOARD_LL) schreibt, könntest Du auch mal einen schreiben und damit prüfen, ob SendInput überhaupt die richtigen Nachrichten generiert. Im Grunde könntest Du damit sogar vergleichen was bei einem echten Tastendruck passiert und was bei einem simulierten.

Hmm, wie sowas geht weiss ich net :-[


Hab aber gerade etwas lustiges entdeckt und zwar: Da es schneller geht starte ich das Programm immer auf dem Device Emulator von Visual Studio (Windows Mobile 5.0 Emulator)

Dann drücke ich (hier noch die "Nachoben" Taste am PPC) auf dem virtuellen Gerät die Taste (per Mausklick) und dann geht der Ton nicht aus (obwohl der Ton auch ausgeht, wenn ich die linke Maustaste gedrückt halte und "Mute" auf der Tastatur drücke).

Nun hab ich das Programm auf meinen PPC kopiert und ausgeführt - siehe da, der Ton auf dem PC mit dem Serverprogramm geht aus.

Warum das mit dem Emulator nicht funktioniert weiss ich nicht, da ich ja auch am echten PPC nur eine normale TCP Verbindung aufbaue, aber hauptsache es geht am echten Gerät (ich weiss das es zwar solche Programme schon gibt, aber ich wills mir selber machen :) )

Aber nochmals Danke für deine Ratschläge Tiku *knuddel*


lg, nixtreffen
 
Zurück
Oben Unten