即時通訊使用keybd_event();我想使用SendMessage();將按鍵發送到記事本,這可以做到嗎?如何將擊鍵發送到窗口?
回答
使用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你可能會感興趣的。
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;
}
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;
}
我希望幫助。
在SendInput()例子中,KEYEVENTF_UNICODE是否在意文本的類型,它可能也是一個char?我看不到KEYEVENTF_SCANCODE,但是你把你的角色放在wScan中。 GetMessageExtraInfo()是否必需? – ManuelSchneid3r 2012-10-17 22:19:12
@DevNoob:不,這應該適用於Unicode和非Unicode版本。 (我只是測試了它。)是的,GetMessageExtraInfo()_appears_是需要的,因爲文檔指定了它是必需的。順便說一下,您的問題的答案也可以通過閱讀我的答案中的鏈接使用相應的函數和類型的MSDN文檔找到。 – Sam 2012-10-18 09:13:05
@DevNoob,我不完全確定你的意思是'KEYEVENTF_KEYUP'被遺漏了。我也不確定你所引用文檔的含義。如果您想知道爲什麼鍵盤事件和鍵盤事件都是必需的,那是因爲它們被用來爲目標窗口生成相應的WM_KEYDOWN和WM_KEYUP窗口消息。我們正在低層次上工作,並且我不認爲Windows API提供了'WM_KEYPRESS'消息來表示單個鍵_press_。 – Sam 2012-10-18 23:33:37
- 1. 將鍵擊發送到窗口
- 2. 如何將鍵盤按鍵發送到活動窗口?
- 3. 如何將JavaScript Keycodes發送到窗口?
- 4. 如何將鼠標點擊事件發送到隱藏窗口?
- 5. 如何將鍵盤輸入發送到OpenGL/DirectX遊戲窗口?
- 6. 如何發送鍵入某些窗口
- 7. 發送關鍵事件到子窗口
- 8. 發送「Enter」鍵到瀏覽器窗口
- 9. 發送鍵盤到非前景窗口
- 10. 當按下「a」鍵時,將「k」鍵發送到其他窗口
- 11. 發送擊鍵組合到背景窗口
- 12. 如何僅將按鍵發送到窗體而不是其他窗口?
- 13. 將剪貼板內容作爲擊鍵發送到Ubuntu的終端窗口
- 14. 將剪貼板文本或擊鍵發送到當前活動窗口
- 15. 如何發送WPF窗口到後面?
- 16. 如何發送按鍵到隱藏窗口?
- 17. 將QStackWidget中的QPushButton單擊事件發送到父窗口
- 18. 將點擊事件發送到非活動窗口
- 19. VB.NET將Tab鍵發送到另一個應用程序窗口
- 20. Mac:將鍵盤事件發送到背景窗口
- 21. Windows:將消息發送到父窗口?
- 22. javascript將數據發送到新窗口
- 23. 如何將按鍵發送到窗口而無需使用Windows API激活它?
- 24. 如何使用SendKeys將模擬鍵盤筆畫發送到活動窗口
- 25. 如何將消息從子類對話框窗口發送到主窗口。 Qt
- 26. 如何將指針事件從活動發送到窗口後面的窗口?
- 27. 如何將元素值從父窗口發送到子圖層窗口元素?
- 28. 通過向命令窗口發送擊鍵來注入命令?
- 29. 發送擊鍵
- 30. Debug.WriteLine如何將消息發送到輸出窗口
那如何將其發送到一個窗口? – H4cKL0rD 2010-01-22 00:04:15
它沒有。你需要在'hWnd'參數中傳遞一個窗口句柄。另外,窗口句柄是* first *參數,而不是第三個參數。 – 2010-01-22 00:12:14
您不能使用SendMessage()發送擊鍵。您無法控制鍵盤狀態。特別是Shift,Control和Alt鍵。 – 2010-01-22 00:23:58