請勿使用PostMessage來模擬鍵盤輸入

漫漫開發路 發佈 2022-11-09T05:19:47.434224+00:00

有些人希望通過向窗口的輸入消息隊列發送鍵盤消息,來實現鍵盤的模擬。從很多方面來說,這不大靠譜,為何?首先,鍵盤輸入比那些印在英文鍵盤上的字母要複雜得多。帶有重音符號的語言有死鍵(Dead Key),遠東語言有各種輸入法編輯器,我不知道複雜的腳本語言如何處理輸入。

有些人希望通過向窗口的輸入消息隊列發送鍵盤消息,來實現鍵盤的模擬。
從很多方面來說,這不大靠譜,為何?

首先,鍵盤輸入比那些印在英文鍵盤上的字母要複雜得多。帶有重音符號的語言有死鍵(Dead Key),遠東語言有各種輸入法編輯器,我不知道複雜的腳本語言如何處理輸入。

其次,即使你有辦法將輸入的消息投遞到目標窗口的消息隊列中,也不會更新鍵盤 SHIFT 按鍵的狀態。當其他應用程式代碼調用 GetKeyState 函數或 GetAsyncKeyState 函數時,它會看到「真實」的移位狀態,而不是你投遞的消息生成的虛假狀態。

有一個辦法

SendInput 函數設計用於將輸入注入到窗口消息隊列中。如果你使用這個 API ,那麼至少可以正確地處理 SHIFT 按鍵的狀態。(不過,我無法幫助你解決複雜的輸入問題。)
儘管可以使用 SendInput,但是有些人可能會說,我還可以使用 mouse_event 和 keybd_event。
但如果你仔細查看 MSDN,則會看到文檔里有這麼一句話:
Note This function has been superseded. Use SendInput instead.

也就是說,官方推薦我們使用 SendInput,而不是***_event。
「superseded」的意思是:我以將這個 API 標記為 「過時的,廢棄的」,可能在以後的某個新版本Windows中,這兩個函數將不再可用。
所以,長痛不如短痛,還是儘量使用 SendInput 吧。

總結

趕緊打開我的 Topomel Box 工程,搜索了下:嗯,確實是用的 SendInput。
妥了。

最後

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關於Windows的小知識,對於廣大Windows平台開發者來說,確實十分有幫助。
本文來自:《You can’t simulate keyboard input with PostMessage》

關鍵字: