2010-01-21 11 views

Antwort

7

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.

+0

Wie sendet es das an ein Fenster? – H4cKL0rD

+0

Es tut es nicht. Sie müssen ein Fensterhandle im Parameter 'hWnd' übergeben. Außerdem ist der Fenstergriff der * erste * Parameter, nicht der dritte. –

+0

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

5

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.

+0

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

+1

@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

+0

@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

Verwandte Themen