Форум: "WinAPI";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.012 c