Verwenden von "User32.dll SendMessage" zum Senden von Schlüsseln mit dem ALT-Modifikator [duplizieren]

Mögliche Duplikate:
C # und SendMessage (Schlüssel) funktionieren nicht

Ich schreibe eine Anwendung, die mithilfe der in definierten SendMessage-Funktion Tastatureingaben an eine andere Anwendung sendetuser32.dll. Ich habe herausgefunden, wie man einen einzelnen Tastenanschlag sendet, aber ich bin ratlos beim Versuch, den Tastenanschlag zusammen mit der ALT-Taste zu senden.

Für die Zwecke meiner Frage werde ich mich auf das Senden von F1 und ALT + F1 konzentrieren.

Wie bereits erwähnt, kann ich die F1-Taste problemlos senden. Hier ist ein Ausschnitt aus meinem Code, der die F1-Taste sendet:

// DLL Imports

//Set the active window
[DllImport("user32.dll")]
public static extern IntPtr SetActiveWindow(IntPtr hWnd);

//sends a windows message to the specified window
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam);

// ...

// Some constants
#define WM_SYSKEYDOWN 260
#define WM_SYSKEYUP 261
#define WM_CHAR 258
#define WM_KEYDOWN 256
#define WM_KEYUP 257

// ...

// activate the window and send F1
SetActiveWindow(hWnd);
ushort action = (ushort)WM_SYSKEYDOWN;
ushort key = (ushort)System.Windows.Forms.Keys.F1;
SendMessage(hWnd, action, key, 0);

Eine interessante Randnotiz ist, dass der obige Code zwar beim Senden der F1-Taste an die Zielanwendung funktioniert, aber nicht mit dem übereinstimmt, was ich mit Spy ++ sehe. Hier ist die Ausgabe des Spy ++ - Protokolls, wenn ich während der Überwachung der Zielanwendung die F1-Taste drücke:

<00001> 00050412 P WM_KEYDOWN nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00002> 00050412 P WM_KEYUP nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:0 fRepeat:1 fUp:1

Beachten Sie, dass zwei Nachrichten gesendet werden, WM_KEYDOWN und WM_KEYUP.

Meine erste Frage wäre, warum ich F1 mit WM_SYSKEYDOWN erfolgreich sende, wenn Spy ++ mir mitteilt, dass WM_KEYDOWN + WM_KEYUP die richtige Nachrichtensequenz ist.

Fahren Sie mit meiner nächsten Herausforderung fort, ALT + F1 zu senden.

Ich habe Spy ++ verwendet, um die Nachrichten zu überwachen, die beim Drücken von ALT + F1 auf meiner Tastatur übermittelt wurden. Folgendes wird angezeigt:

<00001> 00050412 P WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:1 fAltDown:1 fRepeat:0 fUp:0
<00002> 00050412 P WM_SYSKEYDOWN nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:1 fRepeat:0 fUp:0
<00003> 00050412 P WM_SYSKEYUP nVirtKey:VK_F1 cRepeat:1 ScanCode:3B fExtended:0 fAltDown:1 fRepeat:1 fUp:1
<00004> 00050412 P WM_KEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:1 fAltDown:0 fRepeat:1 fUp:1

Angesichts der obigen Spy ++ - Nachrichtenerfassung habe ich versucht, die genaue Nachrichtensequenz mit dem folgenden Code (vereinfacht) zu senden:

SetActiveWindow(hWnd);    
SendMessage(hWnd, (ushort)WM_SYSKEYDOWN, (ushort)System.Windows.Forms.Keys.Menu, 0);
SendMessage(hWnd, (ushort)WM_SYSKEYDOWN, (ushort)System.Windows.Forms.Keys.F1, 0);
SendMessage(hWnd, (ushort)WM_SYSKEYUP, (ushort)System.Windows.Forms.Keys.F1, 0);
SendMessage(hWnd, (ushort)WM_KEYUP, (ushort)System.Windows.Forms.Keys.Menu, 0);

Das hat nicht funktioniert.

Das führt zu meiner nächsten Frage.Kann ich noch etwas versuchen oder mache ich hier etwas falsch?

Wann immer ich die Ausgabe meines Programms mit Spy ++ aufzeichnete, wurde Folgendes protokolliert:

<00001> 00050412 S WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00002> 00050412 R WM_SYSKEYDOWN
<00003> 00050412 S WM_SYSKEYDOWN nVirtKey:VK_F1 cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00004> 00050412 R WM_SYSKEYDOWN
<00005> 00050412 S WM_SYSKEYUP nVirtKey:VK_F1 cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00006> 00050412 R WM_SYSKEYUP
<00007> 00050412 S WM_KEYUP nVirtKey:VK_MENU cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00008> 00050412 R WM_KEYUP

Beachten Sie, dass es gibtextra Nachrichten, die in den Zeilen 2, 4, 6 und 8 gesendet werden.Könnte dies der Grund sein, warum die Dinge nicht funktionieren?

Ich habe eine letzte Frage zum Unterschied zwischen den Nachrichten, die über die tatsächliche Tastatureingabe erfasst wurden, und den Nachrichten, die mit meiner Anwendung erfasst wurden. Beachten Sie diecWiederholen, ScanCode, erweitert, usw.Argumente. Sie sind nicht Null in den Nachrichten, die mit meiner Tastatur als Eingabe erfasst wurden, und sie sind alle Null in den von meiner Anwendung gesendeten Nachrichten.Könnte dies der Grund sein, warum mein Code nicht funktioniert? Wenn ja, wie ändere ich diese Werte? (Ich gehe davon aus, dass sie aus dem 4. Argument für die SendMessage-Funktion stammen, die ich in allen Fällen auf Null gesetzt habe.)

Vielen Dank,

Jan

Antworten auf die Frage(2)

Ihre Antwort auf die Frage