Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.22;
Скачать: CL | DM;

Вниз

HOOK мыши - KeyState?   Найти похожие ветки 

 
Pi314 ©   (2003-07-20 20:54) [0]

Hi All,
Пожалуйста подскажите, кто сталкивался... как в callback-функции (WH_MOUSE) перепослать (дублировать) конкретное сообщение с минимальными накл. раcxодами?

Mоя проблема в следующем: стандартное сообщение мыши содержит информацию о состоянии клавиш - как самой мыши, так и клавиатуры:
TWMMouse = packed record
Msg: Cardinal;
Keys: Longint;
case Integer of
0: (
XPos: Smallint;
YPos: Smallint);
(
Pos: TSmallPoint;
Result: Longint
)
Hi All,
Пожалуйста подскажите, кто сталкивался... как в callback-функции (WH_MOUSE) перепослать (дублировать) конкретное сообщение с минимальными накл. раcxодами?

Mоя проблема в следующем: стандартное сообщение мыши содержит информацию о состоянии клавиш - как самой мыши, так и клавиатуры:
TWMMouse = packed record
Msg: Cardinal;
Keys: Longint;
case Integer of
0: (
XPos: Smallint;
YPos: Smallint);
1: (
Pos: TSmallPoint;
Result: Longint);
end;


которая отсутствует в структуре
typedef struct tagMOUSEHOOKSTRUCT {
POINT pt;
HWND hwnd;
UINT wHitTestCode;
DWORD dwExtraInfo;
} MOUSEHOOKSTRUCT;


поинтер на которую я получаю в lParam. dwExtraInfo, как оказалось, содержит информацию о колесике мыши, а вовсе не о состоянии клавиш, что, на мой взгляд, было бы логичнее. Так что, видимо, нужно добираться до находящегося в очереди оригинального сообщения. Только не совсем понятно, как это сделать, т.е. как распознать именно "мое" конкретное сообщение. Или может есть лучшие идеи?


 
Pi314 ©   (2003-07-20 23:05) [1]

Прошу прощения - забыл код...

type
THookCallStruct = packed record
Code : integer;
WParam : WPARAM;
LParam : LPARAM;
Result : LResult
end;
...
procedure THookPanel.MyHookProc(var HookCallStruct: THookCallStruct);
var
wPar2: WPARAM;
lPar2: LPARAM;
begin
with HookCallStruct do
begin
if (Code = HC_ACTION) or (Code = HC_NOREMOVE) then //"our" hook
if (wParam = WM_LBUTTONDOWN) or (wParam = WM_LBUTTONUP) then //"our" event
if IsChild(Handle, PMouseHookStruct(lParam)^.hwnd) then //event for our child
begin
//Compose Keystate for wParam
wPar2 := ???
//Pack coords into lParam
lPar2 := PMouseHookStruct(lPar)^.pt.x or
(PMouseHookStruct(lPar)^.pt.y shl 16);
//RePost message to self
PostMessage(Handle,wParam, wPar2, lPar2);
end;

//just call next hook in chain...
( ThisHook, Code, wParam, lParam)
Прошу прощения - забыл код...

type
THookCallStruct = packed record
Code : integer;
WParam : WPARAM;
LParam : LPARAM;
Result : LResult
end;
...
procedure THookPanel.MyHookProc(var HookCallStruct: THookCallStruct);
var
wPar2: WPARAM;
lPar2: LPARAM;
begin
with HookCallStruct do
begin
if (Code = HC_ACTION) or (Code = HC_NOREMOVE) then //"our" hook
if (wParam = WM_LBUTTONDOWN) or (wParam = WM_LBUTTONUP) then //"our" event
if IsChild(Handle, PMouseHookStruct(lParam)^.hwnd) then //event for our child
begin
//Compose Keystate for wParam
wPar2 := ???
//Pack coords into lParam
lPar2 := PMouseHookStruct(lPar)^.pt.x or
(PMouseHookStruct(lPar)^.pt.y shl 16);
//RePost message to self
PostMessage(Handle,wParam, wPar2, lPar2);
end;

//just call next hook in chain...
Result := CallNextHookEx (ThisHook, Code, wParam, lParam);
end;
end;


Вот с этим самым wParam у меня и загвоздка. Можно, конечно, по отдельности опросить все GetKeyState(МК_xxx) и загнать соотв. разряды в integer. Но как-то это не шибко элегантно получится... Тем более обидно, что нужное значение-то уже лежит, готовенькое, в очереди... Только как до него добраться?



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

Текущий архив: 2003.09.22;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.028 c
1-71664
kostya-nsk
2003-09-08 18:07
2003.09.22
I/O error 32


7-71983
KSergey
2003-07-09 13:26
2003.09.22
Про выключение компьютера и пример из FAQ Подгрецкого


7-71970
bloodman
2003-07-08 21:23
2003.09.22
HOOk & DLL


6-71791
yurikon
2003-07-24 17:49
2003.09.22
Письмо по почте


14-71947
Fiend
2003-09-01 11:38
2003.09.22
Паздравляю родителей!!!!