2012-09-12 88 views
5

我已經試過GetKeyboardLayoutName()GetKeyboardLayout()獲取當前的鍵盤佈局,但他們都給予我的默認佈局和改變佈局不影響輸出!不能讓當前的鍵盤佈局

while(1) 
{ 
    Sleep(5); 
    for(int i = 8; i < 191; i++) 
    { 
     if(GetAsyncKeyState(i)&1 ==1) 
     { 
      TCHAR szKeyboard[KL_NAMELENGTH]; 
      GetKeyboardLayoutName(szKeyboard); 

      if(GetAsyncKeyState(i)&1 ==1) 
      { 
       TCHAR szKeyboard[KL_NAMELENGTH]; 
       GetKeyboardLayoutName(szKeyboard); 
       cout << szKeyboard << endl ; 
      } 
     } 
    } 
} 

它總是給我「00000409」的時候,默認的佈局設置爲英語,而我希望它是「00000429」當我改變佈局,波斯語。

我的第一個問題在這裏,我曾經通過搜索找到我的所有答案。但現在我經過幾個小時的搜索周圍,並沒有得到任何東西瘋狂駕駛...

+0

不知道這將有助於..嘗試GetKeyboardLayoutList看到,如果你想要的佈局至少裝.. http://msdn.microsoft.com/en-us/library /windows/desktop/ms646297(v=vs.85).aspx –

+0

@MohamedNuur:已經試過了,它被加載了。 – EmJiHash

+0

我沒有看到改變鍵盤佈局的代碼。我只能猜測它沒有改變,你沒有檢查它的錯誤代碼。 – Jay

回答

7

有一點你需要注意的是:: GetKeyboardLayout(..)得到lang作爲傳遞的線程標識符作爲參數。

每個輸入線程可以有不同的輸入語言環境lang。 例如,如果你把IE放在前臺,並按Alt + Shift將lang改爲UK。 (你可以在任務欄中看到它)

現在,如果你將Alt + Tab到另一個窗口(這將在foregorund),你會看到lang不必留在英國。

所以你需要檢查什麼是你傳遞的線程ID。

看看這個代碼,它可以把你的郎爲當前活動窗口:

GUITHREADINFO Gti; 
::ZeroMemory (&Gti,sizeof(GUITHREADINFO)); 
Gti.cbSize = sizeof(GUITHREADINFO); 
::GetGUIThreadInfo(0,&Gti); 
DWORD dwThread = ::GetWindowThreadProcessId(Gti.hwndActive,0); 
HKL lang = ::GetKeyboardLayout(dwThread); 

使用GUITHREADINFO您需要定義WINVER量0x500。 在將所有包含之前放入stdafx.h中。

#ifdef WINVER 
#undef WINVER 
#endif 
#define WINVER 0x500 

來源:GetKeyboardLayout not returning correct language ID (WINXP)

+0

感謝兄弟,它作爲cahrm;) 我曾使用** GetKeyboardLayout(GetCurrentThreadId())**,我認爲它會這樣做... – EmJiHash