Главная страница
    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.45 MB
Время: 0.01 c
14-71848
хз
2003-08-31 02:47
2003.09.22
По юриспруденции


1-71688
oomneeq
2003-09-10 16:27
2003.09.22
VarArrayCreate - массив массивов?


1-71583
Alek Aaz
2003-09-09 13:33
2003.09.22
Печать на принтер


14-71896
DiamondShark
2003-09-04 17:53
2003.09.22
The Assignment


14-71854
ЦЦЦЦ
2003-09-04 12:58
2003.09.22
Где можно купить Делфи в Киеве и по чем?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский