2011-06-01 93 views
0

在我的程序(C++,WinAPI)中,我想模擬按其他正在運行的程序中設置的一些現有熱鍵。我知道有一個模擬鍵盤輸入的SendInput函數,但它似乎工作太多,因爲它需要爲鍵創建很多結構。WM_HOTKEY可以用來模擬熱鍵事件嗎?

我正在嘗試使用SendMessagePostMessage與HWND_BROADCAST和WM_HOTKEY參數。都沒有工作。

的代碼看起來是這樣的:

WORD hotkey = MAKEWORD(MOD_CONTROL, VK_SPACE); // Ctrl + Space 

SendMessage(HWND_BROADCAST, 
      WM_HOTKEY, 
      (WPARAM)hotkey , 0); 

我在正確的軌道上?或者這應該以完全不同的方式完成?

回答

1

誠實地說,SendInput是最好的答案。這是因爲在消息循環中,您對traslateaccellerator的調用將查看該消息,並在該消息中在LPARAM上標記一個位標誌,指示使用該鍵按下了哪些其他鍵。你不想自己填寫那個標誌位,但是.....只是爲了防止你......並且不想使用SendInput ... http://msdn.microsoft.com/en-us/library /ms646280%28VS.85%29.aspx詳細說明如何做到這一點。當然,如果你想使用一個AcceleratorTable,那是很容易用資源編輯器完成,只需在您的消息循環,把它掛了這個http://msdn.microsoft.com/en-us/library/ms646373%28VS.85%29.aspx

+0

感謝您的建議:)我仍然不熟悉加速器的概念,我會繼續在API中挖掘。 – thenick 2011-06-01 14:20:01

1

使用HWND_BROADCAST喜歡的東西WM_HOTKEY。事實上,除非您確實想要將消息廣播到每個窗口,否則應避免使用HWND_BROADCAST。否則,您將在其他窗口處理您的消息時遇到難以置信的麻煩。

您也正在使用WM_HOTKEY錯誤。 wParam不由兩個鍵的HIWORD/LOWORD組成。程序員分配熱鍵RegisterHotKey,它們傳遞一個標識符以及生成帶有該標識符的WM_HOTKEY消息的熱鍵。

有幾種方法可以找到這個標識符,這應該是你的wParam是什麼。首先你可以在RegisterHotKey()上調試目標和斷點,直到找到你想要的。或者,您可以使用Spy ++並定位窗口並檢查標識符是什麼。

當然有可能的熱鍵不是通過熱鍵工作,而是像鍵盤加速器。您需要按照相似的步驟查找當您按下該按鈕時由目標接收的WM_COMMAND或WM_SYSCOMMAND參數。我的建議是使用Spy ++。

+0

是的,感謝您的糾正,熱鍵應該在WM_HOTKEY消息方面在lParam中。對於wParam,我給Spy ++一個去。現在爲句柄...如果我不使用HWND_BROADCAST,我如何獲得另一個程序的特定句柄? Spy ++會幫助我嗎? – thenick 2011-06-01 14:13:57

+0

您可以使用FindWindow從類名或窗口名或兩者中獲取窗口句柄。還有其他方法,例如EnumWindows。 – 2011-06-01 14:17:15

相關問題