我有一個值的字符串,我想模擬每個字符的窗口中的按鍵事件。將字符轉換爲虛擬鍵碼
我打算髮送WM_KEYDOWN,WM_CHAR和WM_KEYUP事件到窗口(因爲這是什麼似乎發生的關鍵是手動按下)。
這些消息需要基於對virtual key codes的表中的wParam一個int發送。我可以遍歷字符串並獲取每個字符,但是如何獲取該字符並將其轉換爲與虛擬鍵碼相對應的值? Convert.ToInt32()不起作用。
我有一個值的字符串,我想模擬每個字符的窗口中的按鍵事件。將字符轉換爲虛擬鍵碼
我打算髮送WM_KEYDOWN,WM_CHAR和WM_KEYUP事件到窗口(因爲這是什麼似乎發生的關鍵是手動按下)。
這些消息需要基於對virtual key codes的表中的wParam一個int發送。我可以遍歷字符串並獲取每個字符,但是如何獲取該字符並將其轉換爲與虛擬鍵碼相對應的值? Convert.ToInt32()不起作用。
發送WM_KEYDOWN/UP很麻煩。應用程序本身已經使用修飾鍵(Shift,Alt,Ctrl)的狀態和鍵盤佈局將WM_KEYDOWN消息轉換爲WM_CHAR。你無法控制這兩者,你會隨機地得到錯誤的人物。
只需發送WM_CHAR消息,設置WPARAM字符碼。沒有必要擔心lparam,很少有應用程序曾經使用它。
它看起來像需要ASCII字符並將其轉換爲十六進制。例如,十六進制中的'A'是41.根據你的圖表,A是0x41,這是正確的(0x引爆十六進制)。
KABOOM!愛它。 – 2010-06-30 18:48:02
*'0x引爆十六進制* *啊,低級代碼的危險。這禪宗珍聞確實解釋了很多。 – 2010-07-01 14:17:59
一般而言,而不是直接發送WM_KEYDOWN
,WM_CHAR
和WM_KEYUP
消息,則應該使用SendInput
(優選的)或可能keybd_event
(建議使用)。
無法使用SendInput或keybd_event,因爲它沒有出現我可以指定一個窗口句柄。即使窗口沒有焦點,我也需要發送消息 – Jeremy 2010-06-30 19:18:47
您可以使用Input Simulator庫,它提供了一個高層次的API來模擬按鍵和處理所有低層次的東西。
我不相信你可以用輸入模擬器指定一個窗口句柄。即使窗口沒有焦點,我也想發送消息。 – Jeremy 2010-06-30 19:19:54
System.Windows.Forms.SendKeys
是一個WinForms類與活動窗口上模擬鍵盤輸入的靜態方法。
美中不足的是,.NET沒有聚焦在另一個應用程序窗口(在SendKeys docs談如何讓周圍)的方式。
這不是我的首選方法,因爲它要求目標應用程序處於最佳狀態。用消息發送字符不需要目標在頂部可見。 – 2015-12-23 03:56:56
一般的解決方法是使用SendMessage WinAPI的功能。 This link描述SendMessage
的簽名並提供樣本導入。
哦,並且爲了映射VK代碼,您應該使用MapVirtualKey - 最好假定映射是任意的而不是邏輯的。
也適用於C++! VkKeyScanEx接受字符和鍵盤佈局::英文版的示例'HKL myKL = LoadKeyboardLayout(「00000409」,0x00000001);'然後只是'VkKeyScanEx(yourChar,myKL);' – 2014-11-20 17:22:37
它似乎工作,至少在這個應用程序。謝謝。 – Jeremy 2010-06-30 19:22:58
沒錯,這個答案可能是最好的方法,除非你正在試圖爲每個keydown/keyup __做別的事情,不需要發送'WM_KEYDOWN'或'WM_KEYUP'消息 - 沒有什麼不可思議的事情發生。 – bobobobo 2010-06-30 19:29:02