2009-07-23 81 views
2

我想通過PostMessage將關鍵筆劃發送到一個應用程序。我也使用Spy ++來試圖理解如何發送消息,因爲我沒有完全理解它的內部工作原理。WM_KEYDOWN:如何使用它?

alt text

在此畫面中,第一項(所選項目)與採用自制的實際關鍵筆劃製成。與它周圍的紅色elipse的一個(下圖)與下面的代碼所做的:

WinApi.PostMessage(InsideLobbyHandle, WinApi.WM_KEYDOWN, (int)WinApi.VK_UP, 1); 

我猜它必須是與最後一個PostMessage的()的參數,但我想不出如何真的有用。我可以在原始鍵擊中看到ScanCode = 48,並且在我的0中,並且fExtended是1,在我的中是0.我怎樣才能讓它看起來一樣?

http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx我不明白最後一個參數的工作。

回答

13

使用SendInput而不是PostMessage模擬鍵盤輸入。

您不能simulate keyboard input with PostMessage

還有some caveats相對於鍵盤狀態/異步狀態:

的SendInput函數不會重置 鍵盤的當前狀態。 因此,如果用戶在調用此函數時按下了任何鍵 ,它們可能會干擾此函數生成的事件 。如果您 擔心可能的 干擾,請使用GetAsyncKeyState 函數檢查鍵盤的 狀態,並根據需要進行更正。


的lParam的用於WM_KEYDOWN Notification在字段的比特的術語指定:

  • 前16位是重複計數
  • 下一8位是掃描碼
  • 下一位爲1表示擴展密鑰,否則爲0
  • 接下來的4位保留,必須爲0
  • 下位始終爲0(爲WM_KEYDOWN)
  • 下一位是前國家重點
  • 最後一位始終爲0(爲WM_KEYDOWN)

警告:您構建的任何解決方案基於PostMessage周圍會變得非常脆弱。

+0

嗯,我想用這個,因爲它會允許我發送輸入而不在窗口上具有焦點。有沒有其他方法可以實現這一點? – 2009-07-23 07:41:12

0

在Spy ++中,如果右鍵單擊突出顯示的(記錄的消息)條目並查看其屬性,則可以看到lParam的確切值。然後你可以使用它作爲你的lParam來確保PostMessage產生類似的效果,就像手動操作一樣。