2010-06-30 153 views
3

我有一個值的字符串,我想模擬每個字符的窗口中的按鍵事件。將字符轉換爲虛擬鍵碼

我打算髮送WM_KEYDOWN,WM_CHARWM_KEYUP事件到窗口(因爲這是什麼似乎發生的關鍵是手動按下)。

這些消息需要基於對virtual key codes的表中的wParam一個int發送。我可以遍歷字符串並獲取每個字符,但是如何獲取該字符並將其轉換爲與虛擬鍵碼相對應的值? Convert.ToInt32()不起作用。

回答

3

發送WM_KEYDOWN/UP很麻煩。應用程序本身已經使用修飾鍵(Shift,Alt,Ctrl)的狀態和鍵盤佈局將WM_KEYDOWN消息轉換爲WM_CHAR。你無法控制這兩者,你會隨機地得到錯誤的人物。

只需發送WM_CHAR消息,設置WPARAM字符碼。沒有必要擔心lparam,很少有應用程序曾經使用它。

+0

它似乎工作,至少在這個應用程序。謝謝。 – Jeremy 2010-06-30 19:22:58

+2

沒錯,這個答案可能是最好的方法,除非你正在試圖爲每個keydown/keyup __做別的事情,不需要發送'WM_KEYDOWN'或'WM_KEYUP'消息 - 沒有什麼不可思議的事情發生。 – bobobobo 2010-06-30 19:29:02

0

它看起來像需要ASCII字符並將其轉換爲十六進制。例如,十六進制中的'A'是41.根據你的圖表,A是0x41,這是正確的(0x引爆十六進制)。

+0

KABOOM!愛它。 – 2010-06-30 18:48:02

+0

*'0x引爆十六進制* *啊,低級代碼的危險。這禪宗珍聞確實解釋了很多。 – 2010-07-01 14:17:59

0

一般而言,而不是直接發送WM_KEYDOWNWM_CHARWM_KEYUP消息,則應該使用SendInput(優選的)或可能keybd_event(建議使用)。

+0

無法使用SendInput或keybd_event,因爲它沒有出現我可以指定一個窗口句柄。即使窗口沒有焦點,我也需要發送消息 – Jeremy 2010-06-30 19:18:47

0

您可以使用Input Simulator庫,它提供了一個高層次的API來模擬按鍵和處理所有低層次的東西。

+0

我不相信你可以用輸入模擬器指定一個窗口句柄。即使窗口沒有焦點,我也想發送消息。 – Jeremy 2010-06-30 19:19:54

0

System.Windows.Forms.SendKeys是一個WinForms類與活動窗口上模擬鍵盤輸入的靜態方法。

美中不足的是,.NET沒有聚焦在另一個應用程序窗口(在SendKeys docs談如何讓周圍)的方式。

+0

這不是我的首選方法,因爲它要求目標應用程序處於最佳狀態。用消息發送字符不需要目標在頂部可見。 – 2015-12-23 03:56:56

0

一般的解決方法是使用SendMessage WinAPI的功能。 This link描述SendMessage的簽名並提供樣本導入。

哦,並且爲了映射VK代碼,您應該使用MapVirtualKey - 最好假定映射是任意的而不是邏輯的。

9

VkKeyScanEx有人嗎?根據MSDN:

「將字符翻譯爲相應的虛擬鍵碼和移位狀態。」

(你可能也使用VkKeyScan但要注意,它已被VkKeyScanEx取代。)

+0

也適用於C++! VkKeyScanEx接受字符和鍵盤佈局::英文版的示例'HKL myKL = LoadKeyboardLayout(「00000409」,0x00000001);'然後只是'VkKeyScanEx(yourChar,myKL);' – 2014-11-20 17:22:37