2012-09-12 13 views
5

He tratado GetKeyboardLayoutName() y GetKeyboardLayout() para conseguir la distribución de teclado actual, pero ambos me dará el diseño predeterminado y el cambio de la disposición no afecta a la salida!no puede conseguir la distribución del teclado actual

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 ; 
      } 
     } 
    } 
} 

Siempre me da "00000409" cuando el diseño predeterminado se establece en Inglés, mientras que yo esperaba que fuera "00000429" cuando cambio el diseño de farsi.

Mi primera pregunta aquí, solía encontrar todas mis respuestas solo buscando. Pero en este momento me estoy volviendo loco después de horas de buscar y obtener nada ...

+0

No estoy seguro de que esto ayudará .. Trate GetKeyboardLayoutList para ver si el diseño que desea es al menos cargada .. http://msdn.microsoft.com/en-us/library /windows/desktop/ms646297(v=vs.85).aspx –

+0

@MohamedNuur: ya lo intenté y está cargado. – EmJiHash

+0

No veo el código que cambie el diseño del teclado. Solo puedo adivinar que falló y que no verificó su código de error. – Jay

Respuesta

7

Una cosa que debes notar es que :: GetKeyboardLayout (..) obtiene la lang para el identificador del hilo pasado como un param .

cada subproceso de entrada puede tener diferentes idiomas locales de entrada. por ejemplo si pones deja IE en primer plano y presionas Alt + Shift the lang changes to UK. (Puede verlo en la barra de tareas)

ahora si va Alt + Tab a otra ventana (que estará en foregorund) verá que lang no tiene que permanecer en el Reino Unido.

así que lo que necesita comprobar es cuál es la identificación del hilo que está pasando.

vistazo a este código se le dará el idioma para la ventana activa actual:

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

de usar GUITHREADINFO es necesario definir WINVER 0x500. pon esto en stdafx.h antes de incluir todo.

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

fuente: GetKeyboardLayout not returning correct language ID (WINXP)

+0

Gracias hermano, funciona como cahrm;) Había usado ** GetKeyboardLayout (GetCurrentThreadId()) ** y pensé que haría eso ... – EmJiHash

Cuestiones relacionadas