2010-04-09 62 views
5

類似的問題已經被問,所以我不會浪費時間來重新解釋它,已有的討論,可以在這裏找到: ToAscii/ToUnicode in a keyboard hook destroys dead keys如何在不破壞密鑰支持的情況下使用ToUnicode?

但是我張貼新的問題的原因是,我似乎遇到了「解決方案」,但我不太清楚如何實施它。

本博客文章似乎提出了一個解決方案的ToUnicode殺死鍵支持問題: http://www.siao2.com/2005/01/19/355870.aspx

但是我不知道如何實現建議的解決方案。一個正確的方向推動將不勝感激。

要清楚,我指的是部分是這樣的:

有兩種方法來解決此問題:

1)您可以保持通話ToUnicode用相同的信息,直到它被清除,然後再撥打一次,將狀態恢復到以前沒有輸入任何內容的狀態,或者

2)您可以提前加載所有鍵盤信息,然後當他們鍵入信息時可以在您自己的信息緩存中查找按鍵的意思,而不必遲到調用API河

我不太清楚如何做這些事情(鍵盤和國際化遠不是我的強項),所以任何幫助將不勝感激。

感謝

回答

4

答案的第一部分是完全信息免費。但是,第二部分確實有道理。 ToUnicode()應該已經是一個純粹的功能,它只是作爲一個查找。但事實並非如此。但是您可以爲所有預期的輸入重複調用它,將它們存儲在自己的查找表中並訪問它。

我建議Microsoft向wFlags參數添加一個lookDontTouch標誌;這將是一個微不足道的API修復。

+5

但修復win32 API將是一個危險的先例。想想如果他們開始*那條路徑,他們在他們之前的工作量。 – jalf 2010-04-09 08:59:01

+0

@jalf:我不確定這是否諷刺。 Windows的i18n/l10n正在積極開發中。對於這個特殊的位,他們可能不需要.Net代碼(鍵盤處理是相當低級的),所以修復Win32 API是一個合理的建議,可能是唯一的方案。 – MSalters 2010-04-09 10:47:14

+0

代碼示例的任何機會將我推向正確的方向?我很尷尬地說我還有點迷路。呃,我非常討厭這個鍵盤的東西。謝謝。 – RaptorFactor 2010-04-09 15:28:43

0

如果您擴大搜索範圍,包括key logging,您可能會收到一些答案。鏈接中顯示的方法與ToUnicode相比非常繁瑣,但它的工作原理。它會圍繞從註冊表中查找當前活動的鍵盤佈局,然後手動加載並分析正確​​的DLL。

作爲警告的提示,我已經看到加載部分在64位Windows上慘敗。

+0

我運行了一些快速測試,似乎代碼確實在x64版本的Windows下失敗,除非代碼是本機編譯爲x64的。 呃,這是屁股上所有這樣的痛苦。 但是,謝謝,這看起來是一個有趣的選擇。 – RaptorFactor 2010-05-11 15:43:18

相關問題