2017-08-22 124 views
0

當我在我的程序中使用KLF_SETFORPROCESS調用activateKeyboardLayout時,該函數將被阻塞,並且不會返回。 我想知道爲什麼這個api被封鎖,我發現這個文檔較少。爲什麼在使用KLF_SETFORPROCESS標誌時窗口API ActivateKeyboardLayout被阻塞?

其他提示: 如果我將activateKeyboardLayout的標誌更改爲KLF_ACTIVATE,它將立即返回。我想弄清楚爲什麼,有人可以幫助我嗎?

+0

請發表[mcve]。 –

回答

0

KLF_ACTIVATE:

此前視窗8:如果指定的輸入區域設置標識符是不 已經加載,則該函數的負載和激活爲當前線程的輸入語言環境 標識符。從Windows 8開始:如果 指定的輸入區域設置標識符尚未加載,則功能 將加載並激活系統的輸入區域設置標識符。

KLF_SETFORPROCESS:

之前的Windows 8:這個標誌是有效的只有KLF_ACTIVATE。 激活整個過程的指定輸入區域標識符 並將WM_INPUTLANGCHANGE消息發送到當前線程的焦點 或活動窗口。通常,LoadKeyboardLayout僅激活當前線程的輸入 區域設置標識符。從Windows 8開始: 未使用此標誌。如果當前進程擁有鍵盤焦點的窗口,則LoadKeyboardLayout將始終激活整個系統的輸入 區域設置標識符。

ActivateKeyboardLayoutKLF_SETFORPROCESS使用SendMessage API調用來遞送WM_INPUTLANGCHANGE窗口消息:

發送指定的消息到窗口或窗口。 SendMessage 函數調用指定窗口的窗口過程,並且 不會返回,直到窗口過程處理完消息。

所以很可能你沒有正確處理消息,或者調用線程完全沒有消息處理隊列。

+0

「KLF_ACTIVATE」似乎不是ActivateKeyboardLayout()的有效標誌。 –

+0

@哈里約翰斯頓,你是什麼意思? – KHacker

+0

@KHacker,[ActivateKeyboardLayout文檔](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646289(v = vs.85).aspx)列出了有效標誌。 「KLF_ACTIVATE」不是其中之一。 –

相關問題