Конференция "WinAPI" » Как узнать язык в окне? [D7, WinXP]
 
  • Вредитель (09.12.07 12:01) [0]
    Нужен способ узнать язык ввода в окне, от которого приходит  message, пойманное ловушкой WH_KEYBOARD.
  • Leonid Troyanovsky © (09.12.07 12:16) [1]

    > Вредитель   (09.12.07 12:01)

    Вредителям, IMHO, язык излишен.

    GetKeyboardLayout, RTFM

    --
    Regards, LVT.
  • Вредитель (09.12.07 12:56) [2]

    var hl:HKL;
    hl:=GetKeyboardLayout(msg.hwnd);
     if hl=LANG_ENGLISH then ShowMessage('!!!');


    msg.hwnd--не прет!
    Чё заместо него должно быть?
  • Leonid Troyanovsky © (09.12.07 13:11) [3]

    > Вредитель   (09.12.07 12:56) [2]

    > Чё заместо него должно быть?

    http://msdn2.microsoft.com/en-us/library/ms646296.aspx

    --
    Regards, LVT.
  • Вредитель (10.12.07 16:16) [4]
    hl:=GetKeyboardLayout(0);
     if hl=LANG_ENGLISH then ShowMessage('!!!');


    Вроде так, но не пашет! А должно -- все как на MSDN!
  • clickmaker © (10.12.07 16:24) [5]
    if Word(hl)=LANG_ENGLISH then
  • Rouse_ © (10.12.07 16:24) [6]
    вот тебе кусочек кода, на вход идет AHandle:

       WndInfo.dwThreadID :=
         GetWindowThreadProcessId(AHandle, WndInfo.dwProcessID);
       AttachThreadInput(GetCurrentThreadId, WndInfo.dwThreadID, True);
       VerLanguageName(GetKeyboardLayout(WndInfo.dwThreadID) and $FFFF,
         WndInfo.szLayoutName, MAXCHAR);
       AttachThreadInput(GetCurrentThreadId, WndInfo.dwThreadID, False);



    WndInfo.szLayoutName - содержит описание раскладки
  • Вредитель (10.12.07 16:58) [7]
    Извините, может туплю, но че такое AHandle? У просто Handle параметров нет!
  • Rouse_ © (10.12.07 17:01) [8]

    > но че такое AHandle?

    Это переменная, в которую должен быть помещен хэнд окна, для которого ты пытаешся получить раскладку. В справке прочти описание по данным функциях - должно помочь.
  • Вредитель (10.12.07 17:30) [9]
    В справке нет, а пишу клав. шпиона, все готово, кроме языков!!!
  • Германн © (10.12.07 17:40) [10]

    > Вредитель   (10.12.07 17:30) [9]
    >
    > В справке нет

    Не ври. В справке все есть.
  • Вредитель © (10.12.07 18:40) [11]
    В какой справке?
    Если можно, кто нибудь киньте мне на mail этот раздел, я весь HD проискал, у меня нет!
  • Rouse_ © (10.12.07 19:27) [12]
  • Германн © (10.12.07 22:03) [13]

    > Вредитель ©   (10.12.07 18:40) [11]
    >
    > В какой справке?
    >

    Лучше конечно читать MSDN, как предагается в [12].
    Но возвращаясь к вопросу р встроенной в Дельфи справке я не верю что на твоем HD нет папки X:\Program Files\Common Files\Borland Shared\MSHelp
  • Вредитель © (11.12.07 12:16) [14]

    > WndInfo.dwThreadID :=      GetWindowThreadProcessId(AHandle,
    >  WndInfo.dwProcessID);    AttachThreadInput(GetCurrentThreadId,
    >  WndInfo.dwThreadID, True);    VerLanguageName(GetKeyboardLayout(WndInfo.
    > dwThreadID) and $FFFF,      WndInfo.szLayoutName, MAXCHAR);
    >     AttachThreadInput(GetCurrentThreadId, WndInfo.dwThreadID,
    >  False);

    На MSDN все нашел, спасибо.
    Но при первом же  message DLL виснет.
  • Rouse_ © (11.12.07 13:26) [15]
    Для вызова данного кода библиотека не нужна :)
  • Вредитель © (11.12.07 13:59) [16]
    Вызывается он из формы.
    Вся конструкция такова: из длл ставится хук WH_KEYBOARD с указанием на процедуру Proc. Proc отсылает пойманное message в Form1 программы Prog. A Form1.OnMessage=messageproc.

    var
     lang:pansiChar;
     pid:Cardinal;
     s:String;
     
    procedure TForm1.messageproc( var msg: tmsg; var handled: boolean);
    begin
    if (msg.message = wm_kbdhook{константа в unit1 и в DLL=0}) then begin
     s:=GetKeyName(msg.lParam){Это моя процедура для узнавания keyname};
     if (IsKeyDown(VK_SHIFT)) then begin {Unit keyboard из GLScene}
      s:=AnsiUpperCase(s);
     end;

     pid :=
        GetWindowThreadProcessId(msg.hwnd, pid);
      AttachThreadInput(GetCurrentThreadId, pid, True);
      VerLanguageName(GetKeyboardLayout(pid) and $FFFF,
        lang, MAXCHAR);
      AttachThreadInput(GetCurrentThreadId, pid, False);
                 
     ShowMessage(lang);

     memo1.Text:=memo1.Text+s;
     handled:=true;
    end;



    И чего не так?
  • Rouse_ © (11.12.07 14:13) [17]
    Это что?
    procedure TForm1.messageproc( var msg: tmsg; var handled: boolean);
  • Вредитель © (11.12.07 14:17) [18]
    Это обработчик всех messages, которые приходят форме!
  • Rouse_ © (11.12.07 14:21) [19]
    Давай код целиком
 
Конференция "WinAPI" » Как узнать язык в окне? [D7, WinXP]
Есть новые Нет новых   [134473   +28][b:0][p:0.002]