2011-02-09 99 views
1

我使用PostMessage模擬後臺程序中的按鍵。除了需要在物理鍵盤上移位的字符以外,它工作正常。我如何模擬輪班? 「創建屏幕鍵盤

我使用的代碼大致是:

VK vk = VkKeyScanEx (c, GetKeyboardLayout (0)); 

AttachThreadInput (_attachedThredId, _attachedProcessId, true); 
PostMessage  (_window, WM_KEYDOWN, vk.key, 0x1); 
PostMessage  (_window, WM_KEYUP, vk.key, 0xC0010001); 
AttachThreadInput (_attachedThredId, _attachedProcessId, false); 

我應該如何處理VK的擴展部分

編輯

我試圖創建一個屏幕上的鍵盤? 。屏幕鍵盤上的每個按鈕都可以模擬一系列按鍵。接收機是一箇舊程序,根據所執行的鍵盤順序執行不同的任務。 鍵盤序列i S作爲如下

  • {ESC} {NN ESC} NN
  • {ESC} NN
  • ½NN
  • §NN

其中{} ESC模擬按下Esc鍵,NN是十六進制值,§/½讓程序聽。

通常我們有特殊的物理鍵盤來控制程序,但它們很貴。因此,在我們並不總是擁有物理鍵盤的測試環境中,我們必須手動輸入這些代碼。

+3

不要使用PostMessage!它不起作用。使用SendInput。 – 2011-02-09 12:55:16

+0

我現在已經介紹了更多我嘗試做的事情。希望你能幫助我 – magol 2011-02-10 10:58:29

回答

4

你必須妥協:

如果你想模擬鍵盤輸入,則必須使用SendInput,這意味着處於哪個窗口的當前具有焦點的憐憫。 SendInput就像打在你的物理鍵盤上的鍵。您可以使用鍵盤將擊鍵發送到特定窗口的唯一方法是在右側窗口輸入ALT+TAB

如果要發送鍵擊到特定的窗口,則招致時髦的行爲:

  1. 應用程序處理的輸入不同。簡單的消息並不是檢測鍵盤輸入的唯一方法。例如,還有鍵盤狀態(GetKeyboardState()),您將有更難模擬的時間。這很可能是你正在經歷的。
  2. 應用程序可能依賴接收鍵盤輸入消息時有焦點的標準行爲。通過向這些應用程序發佈消息,您可以調用可能使其崩潰的奇怪亂序行爲。
  3. 現在系統上的多個窗口可以同時接收鍵盤輸入。這也可能會導致奇怪的行爲。
  4. (etc ...)鉤子不會被調用這個輸入,你的鍵盤/輸入驅動程序不會看到它,它不會被DirectInput等東西識別......基本上它是一個永無止境的拼湊而成通過做一些不好的方法來解決問題。

這些副作用是沒有辦法的;這是做黑幕的結果。


一個解決方案,你的目的,因爲你的目標一個特定的應用程序,可以結合使用PostMessageSetKeyboardState模擬包括移倉鍵盤狀態。

1

就我個人而言,我會使用SendKey.Send()來達到此目的。

MSDN page

+1

從MSDN:發送擊鍵到_active application_。我發送擊鍵的應用程序是不活動的,所以我不能使用它:-( – magol 2011-02-09 12:14:22

+2

+1,你不能使它與PostMessage()。工作。期間。使窗口活動。 – 2011-02-09 13:44:42

2

好吧,我想你在這裏的生活一團糟,PostMessage()是臭名昭著的not working well with shift states,和掛鉤不會得到或者叫做。微軟建議您使用SendInput(),我也是如此。我建議您發佈一個新問題,或者更新這個問題,詳細說明您想要實現的目標,也許我們可以更好地推薦一個不同的解決方案。

至於擴展部分,它與此無關,並不會幫助你。

什麼可能嘗試發送一個WM_KEYDOWN消息,說移動鍵被按下,然後發送另一個消息與您所需的鍵,然後發送一個WM_KEYUP轉移消息。我懷疑這會起作用,但你可以隨時嘗試。