Конференция "WinAPI" » Переключение раскладки клавиатуры в консоли [WinXP]
 
  • ganj (19.08.08 18:44) [0]
    Как переключить раскладку в консоли? И узнать текущую?
    Следующий код не работает (на С++):
    LoadKeyboardLayout( StrCopy(Layout,"00000419"),KLF_ACTIVATE);
    и
    int i= (int)GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(),NULL));
  • Leonid Troyanovsky © (20.08.08 14:05) [1]

    > ganj   (19.08.08 18:44)  

    > Как переключить раскладку в консоли? И узнать текущую?

    Узнать это:
    hkl := GetKeyboardLayout(0);

    А установить (если окно консоли активно):
    ActivateKeyboardLayout(hkl, 0);
    PostMessage(GetForegroundWindow, WM_INPUTLANGCHANGEREQUEST, 1, hkl);

    --
    Regards, LVT.
  • ganj (20.08.08 16:09) [2]

    > Узнать это:
    > hkl := GetKeyboardLayout(0);
    >

    Это не для активного окна. А как для активного окна.
    GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(),NULL));

    не помогает
  • clickmaker © (20.08.08 16:24) [3]
    AttachThreadInput
    GetKeyboardLayout?
  • Leonid Troyanovsky © (20.08.08 16:42) [4]

    > ganj   (20.08.08 16:09) [2]

    > > hkl := GetKeyboardLayout(0);

    > Это не для активного окна. А как для активного окна.

    Это, понятно, для текущего потока.

    А чего, тебя интересуют чужие консоли?
    Ставь системный WH_SHELL, там есть и про раскладку.

    --
    Regards, LVT.
  • ganj (20.08.08 16:44) [5]

    > AttachThreadInput


    Можете написать, как это должно быть? Не понимаю просто.

    AttachThreadInput(
                     GetWindowThreadProcessId(GetForegroundWindow(),NULL),
                     GetWindowThreadProcessId(this->Handle,NULL),
                     true
                     );
    GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(),NULL));


    Так не получается
  • ganj (20.08.08 16:44) [6]

    > AttachThreadInput


    Можете написать, как это должно быть? Не понимаю просто.

    AttachThreadInput(
                     GetWindowThreadProcessId(GetForegroundWindow(),NULL),
                     GetWindowThreadProcessId(this->Handle,NULL),
                     true
                     );
    GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(),NULL));


    Так не получается
  • ganj (20.08.08 16:45) [7]

    > AttachThreadInput


    Можете написать, как это должно быть? Не понимаю просто.

    AttachThreadInput(
                     GetWindowThreadProcessId(GetForegroundWindow(),NULL),
                     GetWindowThreadProcessId(this->Handle,NULL),
                     true
                     );
    GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(),NULL));


    Так не получается
  • ganj (20.08.08 16:45) [8]

    > AttachThreadInput


    Можете написать, как это должно быть? Не понимаю просто.

    AttachThreadInput(
                     GetWindowThreadProcessId(GetForegroundWindow(),NULL),
                     GetWindowThreadProcessId(this->Handle,NULL),
                     true
                     );
    GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(),NULL));


    Так не получается
  • clickmaker © (20.08.08 16:56) [9]
    а так?
    MyThreadId := GetWindowThreadProcessId(this->Handle,NULL);
    AlienThreadId := GetWindowThreadProcessId(GetForegroundWindow(),NULL);
    AttachThreadInput(MyThreadId, AlienThreadId, true);
    kl := GetKeyboardLayout(AlienThreadId);
    AttachThreadInput(MyThreadId, AlienThreadId, false);
  • Leonid Troyanovsky © (20.08.08 17:57) [10]

    > clickmaker ©   (20.08.08 16:56) [9]

    > AlienThreadId := GetWindowThreadProcessId(GetForegroundWindow(),
    > NULL);

    Окно консоли создается другим процессом, AFAIK, csrss.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (20.08.08 17:59) [11]

    > ganj   (20.08.08 16:45) [7]

    > Можете написать, как это должно быть?

    Чего тебе надобно, старче?

    --
    Regards, LVT.
  • ganj (22.08.08 10:45) [12]

    > > ganj   (20.08.08 16:45) [7]
    >
    > > Можете написать, как это должно быть?
    >
    > Чего тебе надобно, старче?


    Я же написал на примере код, он не работает.


    > Окно консоли создается другим процессом, AFAIK, csrss.
    >


    Я смотрел. csrss-10 потоков, открываю несколько консолей - 11 потоков. И непонятно что делать дальше. Так вопрос не решил пока. Как узнать текущую раскладку в окне консоли?
  • Leonid Troyanovsky © (22.08.08 13:37) [13]

    > ganj   (22.08.08 10:45) [12]

    > Я же написал на примере код, он не работает.

    А ты не объяснил, где работает оный код.
    Я ж привел рабочий код для собс-ного консольного приложения.

    Если ты хочешь следить за чужими консолями, то и про это
    был разговор - ставь хук WH_SHELL.

    > к узнать текущую раскладку в окне консоли?

    WH_SHELL, он, кстати, следит и за активацией окон.

    Если же ты хочешь поменять активной консоли раскладку,
    то шли ей SendInput той комбинации, что переключает оную.

    --
    Regards, LVT.
  • white_hat (27.07.09 11:24) [14]
    Удалено модератором
 
Конференция "WinAPI" » Переключение раскладки клавиатуры в консоли [WinXP]
Есть новые Нет новых   [134434   +27][b:0][p:0.001]