-
Нужен способ узнать язык ввода в окне, от которого приходит message, пойманное ловушкой WH_KEYBOARD.
-
> Вредитель (09.12.07 12:01)
Вредителям, IMHO, язык излишен.
GetKeyboardLayout, RTFM
-- Regards, LVT.
-
var hl:HKL;
hl:=GetKeyboardLayout(msg.hwnd);
if hl=LANG_ENGLISH then ShowMessage('!!!'); msg.hwnd--не прет! Чё заместо него должно быть?
-
-
hl:=GetKeyboardLayout(0);
if hl=LANG_ENGLISH then ShowMessage('!!!'); Вроде так, но не пашет! А должно -- все как на MSDN!
-
if Word(hl)=LANG_ENGLISH then
-
вот тебе кусочек кода, на вход идет 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 - содержит описание раскладки
-
Извините, может туплю, но че такое AHandle? У просто Handle параметров нет!
-
> но че такое AHandle?
Это переменная, в которую должен быть помещен хэнд окна, для которого ты пытаешся получить раскладку. В справке прочти описание по данным функциях - должно помочь.
-
В справке нет, а пишу клав. шпиона, все готово, кроме языков!!!
-
> Вредитель (10.12.07 17:30) [9] > > В справке нет
Не ври. В справке все есть.
-
В какой справке? Если можно, кто нибудь киньте мне на mail этот раздел, я весь HD проискал, у меня нет!
-
-
> Вредитель © (10.12.07 18:40) [11] > > В какой справке? >
Лучше конечно читать MSDN, как предагается в [12]. Но возвращаясь к вопросу р встроенной в Дельфи справке я не верю что на твоем HD нет папки X:\Program Files\Common Files\Borland Shared\MSHelp
-
> 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 виснет.
-
Для вызова данного кода библиотека не нужна :)
-
Вызывается он из формы. Вся конструкция такова: из длл ставится хук 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) then begin
s:=GetKeyName(msg.lParam);
if (IsKeyDown(VK_SHIFT)) then begin
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; И чего не так?
-
Это что? procedure TForm1.messageproc( var msg: tmsg; var handled: boolean);
-
Это обработчик всех messages, которые приходят форме!
-
Давай код целиком
|