[英]non-unicode WM_CHAR in unicode windows
我已經編寫了一個DLL,該DLL導出了一個使用RegisterClassExW
和CreateWindowExW
創建窗口的函數。 每條消息都通過
GetMessageW(&msg, wnd_handle, 0, 0);
TranslateMessage(&msg);
DispatchMessageW(&msg);
還有一個程序加載DLL並調用該函數。
盡管使用Unicode窗口創建方法,但即使我鍵入一些非ASCII符號或使用Alt +(代碼), WM_CHAR
消息中的wParam
始終包含ASCII字符。 wParam
代替UTF-16,在“ A”和“ z”之間包含一些ASCII字符。 WndProc
是DLL中的靜態函數。
當所有與窗口相關的代碼都在一個程序中時,不會發生此問題。
有沒有辦法始終在DLL的窗口中包含Unicode WM_CHAR
消息?
問題出在消息檢索過程中。 我將GetMessage()
與窗口的句柄一起使用,而不僅僅是0, GetMessageW(&msg, wnd_handle, 0, 0)
而不是GetMessageW(&msg, 0, 0, 0)
。
這樣, WM_INPUTLANGCHANGEREQUEST
消息被吞下,並且語言環境仍為英語。
您的方法似乎應該可行。
您是否可以調用ANSI DefWindowProc而不是寬版本? 這會將WM_UNICHAR
轉換為ANSI WM_CHAR
消息。 也許那可以解釋您所看到的。
作為實驗,我將直接處理WM_UNICHAR
消息,並查看此時的數據。
我不確定100%,但這可能會有所幫助:
查看實現調用DLL函數的代碼的項目設置。 確保字符集也為UNICODE,而不是多字節:
(轉到“項目屬性”,然后轉到“常規”部分,然后將“字符集”選項設置為“使用Unicode字符集”)。 我以為您使用的是Visual Studio 2003或更高版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.