2013-05-08 91 views
1

GetKeyboardLayout(0)似乎已經決定我的線程正在使用LANG_GERMAN,SUBLANG_GERMAN,LANG_ENGLISHSUBLANG_ENGLISH_US的某種混合。我試着把它放在一個新的項目中,但問題仍然存在......這是我用來測試它的代碼。GetKeyboardLayout返回奇怪的佈局

#include <iostream> 
#include <Windows.h> 
#include <kbd.h> 

int main(int argc, char* argv[]) 
{ 
    std::cout << "Keyboard Layout ID: " << GetKeyboardLayout(0) << "\n"; 
    std::cin.ignore(100, '\n'); 
    return 0; 
} 

這令返回04070409雖然我不認爲應該是可能的。 (或者是嗎?如果是,我將如何構建這個與MAKELANGID?)根據msdn映射到上述語言的混合。我試過使用LoadKeyboardLayoutMAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN),但我只是得到一個標準的LANG_ENGLISH, SUBLANG_ENGLISH(04090409)佈局。我剛剛閱讀文檔錯誤和搞砸了什麼,或者這裏發生了什麼?我沒有想法...

+0

這是*非常*不清楚你想解決什麼問題。除此之外,很可能你不應該解決它。切換鍵盤佈局應該完全由用戶來完成,使用語言欄非常簡單。 – 2013-05-08 13:40:42

+0

問題是ToUnicodeEx需要一個鍵盤佈局,我很難得到。我不想強制用戶進入佈局 – mwerschy 2013-05-08 13:43:23

+0

不,GetKeyboardLayout()就是你使用的。進一步的限制是它是一個特定於進程的值,並且您無法獲得另一個進程的活動鍵盤佈局。這使得在低級別鍵盤中使用ToUnicodeEx會導致失敗的原因。仍然是一個XY問題。 – 2013-05-08 14:05:59

回答

3

這在GetKeyboardLayout的文檔中有解釋。我很驚訝你錯過了它,因爲它是函數返回值的文檔。

返回值

類型:HKL

返回值是用於該線程的輸入區域設置標識符。 低位字包含輸入語言的Language Identifier,高位字包含 鍵盤的物理佈局的設備句柄。

04070409因此是實體德語鍵盤上美式英語語言的佈局。

由於MAKELANGID創建了語言ID,所以不能使用MAKELANGID,但這是HKL(鍵盤佈局句柄)。

不清楚爲什麼你關心句柄的數值。手柄的本質是它們應該是不透明的。

+0

嗯,這不會幫助我看到AFAIK我在德國鍵盤上使用德語佈局。從什麼時候美英版面包含「äöü」等? – mwerschy 2013-05-08 14:40:31

+0

這不是美式英文版式。這是美國英語。系統會將您的打字解釋爲打算用於英語。 – 2013-05-08 14:42:04

+0

哦對。那麼爲什麼'LoadKeyboardLayout'拒絕讓我成爲德國人的佈局呢?編輯:我可能不需要關心看到,因爲我可以使用'GetKeyboardLayout'返回的佈局,但我仍然想知道;) – mwerschy 2013-05-08 14:43:31