im mit keybd_event(); und ich möchte SendMessage() verwenden; um den Tastenanschlag an den Notizblock zu senden, kann dies getan werden?Wie senden Sie Tastenanschläge an ein Fenster?
Antwort
SendMessage
mit Text in den Bearbeitungspuffer einzufügen (was es klingt wie Sie wollen):
HWND notepad = FindWindow(_T("Notepad"), NULL);
HWND edit = FindWindowEx(notepad, NULL, _T("Edit"), NULL);
SendMessage(edit, WM_SETTEXT, NULL, (LPARAM)_T("hello"));
wenn Sie keycodes und beliebige Tastatureingaben benötigen, können Sie SendInput()
(erhältlich in 2k/XP und bevorzugt) verwenden oder keybd_event()
`einige Beispiele hier (die Send in neueren OSs Aufruf wird am Ende):
http://www.codeguru.com/forum/showthread.php?t=377393
gibt es auch WM_SYSCOMMAND/WM_KEYDOWN/WM_KEYUP/WM_CHAR Veranstaltungen für Sen dMessage, an der Sie interessiert sein könnten.
keybd_event() wurde durch SendInput() ersetzt, daher ist es das Beste, das zu verwenden. Hier ist ein Beispielcode, um das zu tun, was Sie gefragt haben. Sie können das Bearbeitungssteuerelement des Editor-Fensters entweder direkt mit SendMessage() bearbeiten oder Sie können SendInput() verwenden, um Tastatureingaben zu synthetisieren, die an das Fenster gesendet werden.
Mit SendInput()
:
int SendKeystrokesToNotepad(const TCHAR *const text)
{
INPUT *keystroke;
UINT i, character_count, keystrokes_to_send, keystrokes_sent;
HWND notepad;
assert(text != NULL);
//Get the handle of the Notepad window.
notepad = FindWindow(_T("Notepad"), NULL);
if(notepad == NULL)
return 0;
//Bring the Notepad window to the front.
if(!SetForegroundWindow(notepad))
return 0;
//Fill in the array of keystrokes to send.
character_count = _tcslen(text);
keystrokes_to_send = character_count * 2;
keystroke = new INPUT[ keystrokes_to_send ];
for(i = 0; i < character_count; ++i)
{
keystroke[ i * 2 ].type = INPUT_KEYBOARD;
keystroke[ i * 2 ].ki.wVk = 0;
keystroke[ i * 2 ].ki.wScan = text[ i ];
keystroke[ i * 2 ].ki.dwFlags = KEYEVENTF_UNICODE;
keystroke[ i * 2 ].ki.time = 0;
keystroke[ i * 2 ].ki.dwExtraInfo = GetMessageExtraInfo();
keystroke[ i * 2 + 1 ].type = INPUT_KEYBOARD;
keystroke[ i * 2 + 1 ].ki.wVk = 0;
keystroke[ i * 2 + 1 ].ki.wScan = text[ i ];
keystroke[ i * 2 + 1 ].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
keystroke[ i * 2 + 1 ].ki.time = 0;
keystroke[ i * 2 + 1 ].ki.dwExtraInfo = GetMessageExtraInfo();
}
//Send the keystrokes.
keystrokes_sent = SendInput((UINT)keystrokes_to_send, keystroke, sizeof(*keystroke));
delete [] keystroke;
return keystrokes_sent == keystrokes_to_send;
}
Mit SendMessage()
:
int SendKeystrokesToNotepad(const TCHAR *const text)
{
HWND notepad, edit;
assert(text != NULL);
//Get the handle of the Notepad window.
notepad = FindWindow(_T("Notepad"), NULL);
if(notepad == NULL)
return 0;
//Get the handle of the Notepad window's edit control.
edit = FindWindowEx(notepad, NULL, _T("Edit"), NULL);
if(edit == NULL)
return 0;
SendMessage(edit, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)text);
return 1;
}
Ich hoffe, das hilft.
Ist im KEYEVENTF_UNICODE im Beispiel von SendInput() der Texttyp wichtig, der auch ein Zeichen sein kann? Ich sehe keinen KEYEVENTF_SCANCODE, aber Sie setzen Ihren Charakter in wScan. Ist GetMessageExtraInfo() notwendig? – ManuelSchneid3r
@DevNoob: Nein, dies sollte für Unicode- und Nicht-Unicode-Builds funktionieren. (Ich habe es gerade getestet.) Ja, GetMessageExtraInfo() _ erscheint als notwendig, da die Dokumentation angibt, dass es erforderlich ist. Die Antworten auf Ihre Fragen finden Sie übrigens auch, indem Sie die MSDN-Dokumentation für die entsprechenden Funktionen und Typen über den Link in meiner Antwort lesen. – Sam
@DevNoob, ich bin mir nicht ganz sicher, was du über 'KEYEVENTF_KEYUP' bedeutest, das weggelassen wird. Ich bin mir auch nicht sicher, was Sie mit dem Teil der Dokumentation meinen, den Sie zitiert haben. Wenn Sie sich fragen, warum Key-Down- und Key-Up-Tastaturereignisse erforderlich sind, liegt dies daran, dass diese verwendet werden, um entsprechende WM_KEYDOWN- und 'WM_KEYUP'-Fenstermeldungen für das Zielfenster zu erzeugen. Wir arbeiten auf einer niedrigen Ebene, und ich denke nicht, dass die Windows-API eine 'WM_KEYPRESS'-Nachricht bereitstellt, um einen einzigen Schlüssel _press_ darzustellen. – Sam
- 1. Senden Sie Tastenanschläge an vorderste App von Sandboxed Kakao App
- 2. Verwenden Sie Python, um Tastenanschläge an Spiele in Windows zu senden?
- 3. Senden einer Tastenkombination an ein Mac OS X-Fenster
- 4. Senden von Daten an ein Fenster mit AutoIt Python
- 5. Senden Tastatureingaben an ein Programm
- 6. Zeichenfolge (Zeichen) an aktives Fenster senden
- 7. So senden Sie Daten an UI Bootstrap Modal Fenster $ Scope?
- 8. Tastenanschläge ohne Textfelder erkennen?
- 9. java.awt.Robot.keyPress für kontinuierliche Tastenanschläge
- 10. Wie docken Sie ein Pop-Out-Fenster an?
- 11. Java: Wie protokolliert man Tastenanschläge im Hintergrund?
- 12. Mac: Schlüsselereignis zum Hintergrund senden Fenster
- 13. Ein Formular an Facebox senden
- 14. WM_COMMAND an ein TMenuItem senden
- 15. Senden Sie Formulardaten an Javascript beim Senden
- 16. Senden Sie Javascript-Daten an Django Ansichten
- 17. Wie sperrt man ein Fenster an ein anderes? [winforms]
- 18. Wie senden Sie Aktionen an übergeordnete Controller?
- 19. Wert von Popup-Fenster (untergeordnetes Element) an übergeordnetes Element senden
- 20. Wie hängt man Fenster an ein anderes Fenster in DHTMLX an?
- 21. Öffnen Sie ein kleines schwebendes Fenster an der Cursorposition
- 22. Tastenanschläge im Dialogfeld unterdrücken
- 23. Ein Fenster an sich selbst binden?
- 24. erstellen Sie ein Fenster opencv
- 25. Wie verstecken Sie ein Gtk # -Fenster?
- 26. Senden Sie ein Signal an USB mit C#
- 27. Wie zeige ich ein untergeordnetes Fenster auf seinem Elternteil an?
- 28. So senden Sie ein Ereignis an mehrere Formulare in Delphi
- 29. WPF-Fenster friert ein, nachdem Datei an Dropbox gesendet wurde
- 30. So senden Sie ein Formular an eine JavaScript-Funktion
Wie sendet es das an ein Fenster? – H4cKL0rD
Es tut es nicht. Sie müssen ein Fensterhandle im Parameter 'hWnd' übergeben. Außerdem ist der Fenstergriff der * erste * Parameter, nicht der dritte. –
Sie können SendMessage() nicht verwenden, um Tastenanschläge zu senden. Sie können den Tastaturstatus nicht steuern. Besonders die Shift, Control und Alt Tasten. –