Задать вопрос
  • C#, Как определить раскладку клавиатуры консольного приложения в другом потоке (по handle окна) в Windows 10?

    @ajka454
    с Windows 7 под консоль запускается процесс CONHOST, в котором есть поток с окном класс="IME"
    владелей этого окна=GetAncestor(hwnd, GA_ROOTOWNER) - окно консоли.
    окно IME чутко реагирует на смену раскладки, котокую можно получить через GetKeyboardLayout
    быстрый способ найти ЭТО окно через EnumWindows, перебор процессов -> потоков -> окон в разы дольше

    HWND hWnd=hWndCon; //окно консоли
    EnumWindows(CallBackEnumWnd, (LPARAM)&hWnd);
    if(hWnd!=hWndCon && ::IsWindow(hWnd))
    DWORD tid = ::GetWindowThreadProcessId(hWnd, 0);
    hkl = ::GetKeyboardLayout(tid); //1033(0x409)-en 1049(0x419)-ru

    BOOL CALLBACK CallBackEnumWnd(HWND hwnd, LPARAM lParam)
    char sClassName[256];
    int ns = GetClassName(hwnd, sClassName, 256);
    if(ns>2 && 0==_stricmp(sClassName, "IME") ) //сравнение в lowercase
    if(*(HWND*)lParam==::GetAncestor(hwnd, GA_ROOTOWNER)) //владелец тукущая консоль
    *(HWND*)lParam = hwnd;
    return FALSE; //стоп перебор
    Ответ написан
    Комментировать