Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.015 c
1-71678
LinOS
2003-09-11 12:14
2003.09.22
Как при нажатии на кнопку добавить в MainMenu пункты из PopupMenu


1-71707
TGrey
2003-09-10 20:10
2003.09.22
Русский текст в консоли


14-71940
Jaxtor
2003-09-04 16:15
2003.09.22
Объектно-ориентированные базы данных


1-71682
drdred
2003-09-09 23:37
2003.09.22
Как скопировать файл?


1-71755
ruslan_as
2003-09-10 10:18
2003.09.22
Как вложить файл PDF в мой EXE





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