2012-09-12 11 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 ; 
      } 
     } 
    } 
} 

यह हमेशा मुझे "00,000,409" जब डिफ़ॉल्ट लेआउट अंग्रेजी के लिए सेट है देता है, जबकि मैं इसे जब मैं फारसी के लेआउट बदलने "00,000,429" होने की उम्मीद।

मेरा पहला सवाल, मैं सिर्फ खोज करके अपने सभी उत्तरों को ढूंढता था। लेकिन अभी मैं चारों ओर खोज करने और कुछ भी प्राप्त करने के घंटों के बाद पागल गाड़ी चला रहा हूं ...

+0

सुनिश्चित नहीं हैं कि इस में मदद मिलेगी .. यदि लेआउट आप चाहते हैं कम से कम लोड हो जाने को देखने के लिए GetKeyboardLayoutList प्रयास करें .. http://msdn.microsoft.com/en-us/library /windows/desktop/ms646297(v=vs.85).aspx –

+0

@ मोहम्मदनूर: पहले से ही कोशिश की गई है और यह लोड हो गया है। – EmJiHash

+0

मुझे वह कोड नहीं दिख रहा है जो कीबोर्ड लेआउट बदलता है। मैं केवल अनुमान लगा सकता हूं कि यह विफल हो गया है और आपने इसका त्रुटि कोड नहीं देखा है। – Jay

उत्तर

7

एक बात जो आपको नोटिस करने की आवश्यकता है वह है कि :: GetKeyboardLayout (..) को पारित थ्रेड पहचान के लिए लांग प्राप्त होता है ।

प्रत्येक इनपुट थ्रेड में अलग-अलग इनपुट लोकेल लैंग हो सकते हैं। उदाहरण के लिए यदि आप आईई को अग्रभूमि में डाल देते हैं और यूके में लैंग परिवर्तनों को Alt + Shift दबाते हैं। (आप इसे टास्कबार में देख सकते हैं)

अब यदि आप Alt + Tab को दूसरी विंडो (जो फोरगोरंड में होंगे) में देखेंगे तो आप देखेंगे कि लैंग को यूके नहीं रहना है।

तो आपको यह जांचने की आवश्यकता है कि आप जिस थ्रेड आईडी को पार कर रहे हैं वह क्या है। इस कोड में

देखो यह वर्तमान सक्रिय विंडो के लिए आप लैंग मिल जाएगा:

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

संबंधित मुद्दे