2010-01-21 111 views

回答

7

使用SendMessage插入文字編輯緩衝區(這聽起來像你想):

HWND notepad = FindWindow(_T("Notepad"), NULL); 
HWND edit = FindWindowEx(notepad, NULL, _T("Edit"), NULL); 
SendMessage(edit, WM_SETTEXT, NULL, (LPARAM)_T("hello")); 

,如果你需要的鍵碼和任意按鍵,你可以使用SendInput()(可在2K/XP和首選)或keybd_event()`(這將最終調用SendInput在較新的操作系統)一些例子在這裏:

http://www.codeguru.com/forum/showthread.php?t=377393

這裏還有WM_SYSCOMMAND/WM_KEYDOWN/WM_KEYUP/WM_CHAR的森活動dMessage你可能會感興趣的。

+0

那如何將其發送到一個窗口? – H4cKL0rD 2010-01-22 00:04:15

+0

它沒有。你需要在'hWnd'參數中傳遞一個窗口句柄。另外,窗口句柄是* first *參數,而不是第三個參數。 – 2010-01-22 00:12:14

+0

您不能使用SendMessage()發送擊鍵。您無法控制鍵盤狀態。特別是Shift,Control和Alt鍵。 – 2010-01-22 00:23:58

5

keybd_event()已被取代的SendInput(),所以它的最好使用。這裏有一些示例代碼可以完成你所要求的功能。您可以使用SendMessage()直接編輯記事本窗口的編輯控件,也可以使用SendInput()來合成要發送到窗口的按鍵。

使用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; 
} 

使用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; 
} 

我希望幫助。

+0

在SendInput()例子中,KEYEVENTF_UNICODE是否在意文本的類型,它可能也是一個char?我看不到KEYEVENTF_SCANCODE,但是你把你的角色放在wScan中。 GetMessageExtraInfo()是否必需? – ManuelSchneid3r 2012-10-17 22:19:12

+1

@DevNoob:不,這應該適用於Unicode和非Unicode版本。 (我只是測試了它。)是的,GetMessageExtraInfo()_appears_是需要的,因爲文檔指定了它是必需的。順便說一下,您的問題的答案也可以通過閱讀我的答案中的鏈接使用相應的函數和類型的MSDN文檔找到。 – Sam 2012-10-18 09:13:05

+0

@DevNoob,我不完全確定你的意思是'KEYEVENTF_KEYUP'被遺漏了。我也不確定你所引用文檔的含義。如果您想知道爲什麼鍵盤事件和鍵盤事件都是必需的,那是因爲它們被用來爲目標窗口生成相應的WM_KEYDOWN和WM_KEYUP窗口消息。我們正在低層次上工作,並且我不認爲Windows API提供了'WM_KEYPRESS'消息來表示單個鍵_press_。 – Sam 2012-10-18 23:33:37

相關問題