Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Вниз

Как поставить глобальный хук на смену языка ввода под NT?   Найти похожие ветки 

 
Дремучий   (2003-10-24 12:52) [0]

сабж, интересует именно глобальный хук. Потому как в пределах проги, все отлавливается нормально.


 
Игорь Шевченко   (2003-10-24 12:53) [1]

А язык вообще-то меняется для каждого приложения независимо...Аналог internat пишешь ? Так в сети исходников навалом..


 
Дремучий   (2003-10-24 13:10) [2]


> Аналог internat пишешь ?

да, под XP надо.


> Так в сети исходников навалом..

угу, валом. Для отслеживания в рамках приложения.
Для глобальной слежки ставится таймер и отлеживается состояние текущей(уже смененной) раскладки. ИМХО, это изврат.

Я эксперементировал с HSHELL_LANGUAGE и WM_INPUTLANGCHANGE,
но к желаемого результата, увы, не достиг.


 
Дремучий   (2003-10-24 13:48) [3]


> А язык вообще-то меняется для каждого приложения независимо...

я это понял, только ведь когда идет переключение с приложения на приложение должно же посылаться какое-то сообщение операционке которое воссанавливает тот язык, который был выбран для того приложения, на которое мы переключились? Так вот что и где именно нужно ловить?


 
Song   (2003-10-24 13:57) [4]

WM_INPUTLANGCHANGEREQUEST ?


 
Дремучий   (2003-10-24 14:14) [5]


> Song ©

а где ставить перехват? так что ли?

unit langconst;
interface
const
MsgFromDLL = "Message from idlehook.dll";
WM_MYLANGHOOK = WM_USER + 1;

implementation
end.


library langhook;
uses
Windows,
Messages,
Classes;

var
MyAppWnd: HWND;
LangSysHook: HWND;

{$include "langconst.pas"}
{$R *.RES}

//function ShellProc(code: integer; wParam: word; lParam: longint) : longint; stdcall;
function WindowProc(hwnd: HWND; uMsg:UINT; wParam: word; lParam: longint): longint; stdcall;
begin

{
if code < 0
then begin
Result:= CallNextHookEx(LangSysHook, Code, wParam, lParam);
Exit;
end;
}

//


 
Song   (2003-10-24 14:20) [6]

А почему хук у тебя на WH_CALLWNDPROC?


 
Дремучий   (2003-10-24 14:41) [7]

а в каком из
WH_SHELL WH_CALLWNDPROC WH_GETMESSAGE
перехватывается WM_INPUTLANGCHANGEREQUEST ?


 
Song   (2003-10-24 14:47) [8]

:) Простейший способ прочитать по ним хэлп.
Я бы даже по названию понял.


 
Игорь Шевченко   (2003-10-24 14:51) [9]


> я это понял, только ведь когда идет переключение с приложения
> на приложение должно же посылаться какое-то сообщение операционке
> которое воссанавливает тот язык, который был выбран для
> того приложения, на которое мы переключились?


Не должно. Текущая раскладка клавиатуры - это атрибут процесса.
Сообщение WM_INPUTLANGCHANGE.... посылается текущему приложению переднего плана. Сообщение посылается оболочке, чтобы она отобразила нужную раскладку на индикаторе клавиатуры.
Тебе имеет смысл сделать hook WM_SHELL


 
Игорь Шевченко   (2003-10-24 14:54) [10]

Пардон, WH_SHELL


 
Дремучий   (2003-10-24 15:28) [11]


> Игорь Шевченко © (24.10.03 14:54) [10]
> Пардон, WH_SHELL

делал, с него и начинал.
WH_SHELL >> HSHELL_LANGUAGE

library langhook;
uses
Windows,
Messages,
Classes;

var
MyAppWnd: HWND;
LangSysHook: HWND;
WM_MYLANGHOOK: cardinal;
const
MsgFromDLL = "Message from idlehook.dll";

{$R *.RES}

function ShellProc(code: integer; wParam: word; lParam: longint) : longint; stdcall;
begin
if code < 0
then begin
Result:= CallNextHookEx(LangSysHook, Code, wParam, lParam);
Exit;
end;

//посылаем сообщение приложению из длл
if (code = HSHELL_LANGUAGE)
then begin
SendMessage(MyAppWnd, WM_MYLANGHOOK, wParam, lParam);//AppWnd
end;

Result:= CallNextHookEx(LangSysHook, Code, wParam, lParam);
end;

{Процедура установки HOOK-а}
procedure HookProc(Active: boolean; hMainProg: HWND) export; stdcall;
begin
if Active
then begin
MyAppWnd:= hMainProg;
LangSysHook:= SetWindowsHookEx(WH_SHELL, @ShellProc, HInstance, 0); //WH_SHELL WH_CALLWNDPROC WH_GETMESSAGE ShellProc
if LangSysHook = 0
then MessageBox(0, "Lang-HOOK установить не удалось !", MsgFromDLL, 0)
else MessageBox(0, "Lang-HOOK установлен! ", MsgFromDLL, 0);
end
else begin
if not UnhookWindowsHookEx(LangSysHook)
then MessageBox(0, "Lang-HOOK снять не удалось !", MsgFromDLL, 0)
else MessageBox(0, "Lang-HOOK снят! ", MsgFromDLL, 0);;
end;
end;

exports HookProc;

begin
{регестрируем свой тип сообщения в системе}
WM_MYLANGHOOK:= RegisterWindowMessage("WM_MYKEYHOOK");
end.


а в самой проге:

procedure TfmMain.WndProc(var Msg: TMessage);
begin
{Но если пришло моё сообщение - выполняем следующий код}
if Msg.Msg = WM_MYLANGHOOK
then begin
fmMain.kbdLayout.SetHKL(Msg.lParam);
if (Msg.Msg = WM_MYLANGHOOK) then MessageBox(0, "WM_MYLANGHOOK!", MsgFromDLL, 0);
end;

//выполняем всё то, что должно происходить при поступлении сообщеня окну
inherited;
end;

initialization
{регестрируем свой тип сообщения в системе}
WM_MYLANGHOOK:= RegisterWindowMessage("WM_MYKEYHOOK");
finalization


В фаре(консольное приложение) работает, в других прогах - нет. Хуки ставятся нормально. А вот месага почему-то не доходит... Почему?


 
Игорь Шевченко   (2003-10-24 15:30) [12]

Я не совсем понял, какую задачу ты хочешь решить, давай плясать от условия


 
Дремучий   (2003-10-24 15:40) [13]

мне нужен индикатор текущего языка ввода(раскладки клавиатуры) - аналог internat под XP.


 
Дремучий   (2003-10-24 15:56) [14]

может, я неправильно определяю адресата ссобщения?

в проге ставил
hook(true, fmMain.Handle);//главная прога
hook(true, Application.Handle);


в ддл >>
MyAppWnd:= hMainProg;
SendMessage(MyAppWnd, WM_MYLANGHOOK, wParam, lParam);//AppWnd


 
Игорь Шевченко   (2003-10-24 16:49) [15]

Дремучий © (24.10.03 15:40)


> мне нужен индикатор текущего языка ввода(раскладки клавиатуры)
> - аналог internat под XP.


Для любого приложения ? Ищи, в google где-то был пример. В XP, кстати, уже есть индикатор, чем он тебе не нравится ?


 
Дремучий   (2003-10-24 17:04) [16]


> Для любого приложения ? Ищи, в google где-то был пример.
> В XP, кстати, уже есть индикатор, чем он тебе не нравится
> ?

1)тем, что он "слетел", и восстановить его не получается (в меню отсутствует, в настройках кнопка для настройки индикатора недоступна).
2)вопрос написания своего индикатора перерос в обычного в принципиальный


 
Дремучий   (2003-10-24 18:02) [17]

HSHELL_LANGUAGE - только для Win95. И что дальше?


 
Дремучий   (2003-10-24 18:46) [18]

так как поставить глобальный хук на
WM_INPUTLANGCHANGEREQUEST/WM_INPUTLANGCHANGE ?


 
DVM   (2003-10-24 20:36) [19]


> HSHELL_LANGUAGE - только для Win95. И что дальше?

Не только. По крайней мере в XP работает!


 
Дремучий   (2003-10-27 16:46) [20]


> DVM © (24.10.03 20:36) [19]
> > HSHELL_LANGUAGE - только для Win95. И что дальше?
> Не только. По крайней мере в XP работает!

ага, работает. Если ставить хук в проге(локальный).
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=13726

а если ставишь в длл(глобальный) - наблюдаем большую фигу.
http://firststeps.narod.ru/winapi/hook/36.html
да и во многих других источниках:
HSHELL_LANGUAGE - Только для Windows 95: язык клавиатуры был изменен, или была загружена новая раскладка символов на клавиатуре.


 
DVM   (2003-10-27 18:15) [21]


> HSHELL_LANGUAGE - Только для Windows 95: язык клавиатуры
> был изменен, или была загружена новая раскладка символов
> на клавиатуре.

И глобально из длл все тоже нормально ловится. В данном случае "только 95" означает, что не 3.11.


 
Song   (2003-10-28 12:44) [22]

>>так как поставить глобальный хук на
>>WM_INPUTLANGCHANGEREQUEST/WM_INPUTLANGCHANGE ?

WH_GETMESSAGE пробовал? Не вижу причины почему не должно так отлавливать. Если я не прав, пусть коллеги подправят.


 
Дремучий   (2003-10-29 11:55) [23]


> В данном случае "только 95" означает, что не 3.11.

блин, отстойно написано. Не могли написать Win32?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
3-75127
r900
2003-11-28 11:16
2003.12.23
Запись в поле таблицы?


3-75092
digester
2003-11-30 13:09
2003.12.23
ПОМОГИТЕ Пожалуйста с IBQUERY


14-75326
.Lex
2003-11-28 13:14
2003.12.23
Ксавье Пачеко: Borland Delphi 6(5). Руководство разработчика


14-75329
Мазут Береговой
2003-12-02 04:18
2003.12.23
Эта ветка чи-иста-а для любознательных па-ацанов!...


3-75116
ja
2003-11-28 17:58
2003.12.23
Синхронизация пары DBLookupComboBox ов на одном DataSource е





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский