![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ловушки для активИксов [D7, Win2k]
Rem © (2004-07-20 17:17:00)Добренького здоровечка мастера! У меня такая проблема! Есть компоненты ActiveX, я их юзаю в своей проге. Мне необходимо поставить ловушку WH_MOUSE на этот компонент. Проблема в том, что ловушка не воспринимает нажатие на правую клавишу мыши. Я слышал, что ActiveX компоненты используют свое адресное пространство памяти. Как мне поставить ловушку?
Digitman (2004-07-22 10:59:00) [1]
> BRemB
никак
при установке хука тебе нужно указать Id того трэда, который создал окно, сообщениями которому ты интересуешься
BRemB (2004-07-22 10:38:00) [2]
> не адресованы сообщения польз.ввода
а как мне адресовать сообщения в данном случае?
Digitman (2004-07-21 17:19:00) [3]
> почему она у меня не хочет с тек. процессом работать?
локальный хук ставится не на процесс, а на указанный кодовый поток
если окнам, созданным этим код.потоком, не адресованы сообщения польз.ввода (как в случае с WH_JOURNALRECORD), то и ожидать их нечего - не дождешься ты их
BRemB (2004-07-21 16:49:00) [4]Странно, почему она у меня не хочет с тек. процессом работать?
function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint; stdcall;
var msg : PEVENTMSG;
begin
if Code >= 0 then
begin
Result := 0;
msg := Pointer(lParam);
case msg.message of
WM_RBUTTONDOWN: frmMain.Memo1.Lines.Add('WM_RBUTTONDOWN');
WM_RBUTTONUP: frmMain.Memo1.Lines.Add('WM_RBUTTONUP');
WM_LBUTTONDOWN: frmMain.Memo1.Lines.Add('WM_LBUTTONDOWN');
WM_LBUTTONUP: frmMain.Memo1.Lines.Add('WM_LBUTTONUP');
end;
end else Result:=CallNextHookEx(HookHandle, code, wParam, lParam);
end;
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @Key_Hook, 0, GetCurrentThreadId());
BRemB (2004-07-21 16:38:00) [5]Можно исправить на
HookHandle:=SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, 0, GetCurrentThreadId);
будет с текущим
Digitman (2004-07-21 16:32:00) [6]
> нашел у себя ловушку, давно писал, там я использую журнализацию
а зачем тебе глоб.хук ? ты же работаешь с тек.процессом ?
BRemB (2004-07-21 16:14:00) [7]
> function MouseHook(Code: integer; wParam: dword; MouseHookStruct:
> PMouseHookStruct): Longint; stdcall;
> begin
> try
> if HC_ACTION >= 0 then
> Case wParam of
> WM_RBUTTONDOWN: frmMain.Memo1.Lines.Add('WM_RBUTTONDOWN');
> WM_RBUTTONUP: frmMain.Memo1.Lines.Add('WM_RBUTTONUP');
> WM_LBUTTONDOWN: frmMain.Memo1.Lines.Add('WM_LBUTTONDOWN');
> WM_LBUTTONUP: frmMain.Memo1.Lines.Add('WM_LBUTTONUP');
> end;
> finally
> Result := CallNextHookEx(0, Code, wParam, lParam);
> end;
> end;
Это не работает, я нашел у себя ловушку, давно писал, там я использую журнализацию. Вот код:
function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg : PEVENTMSG;
MoveX, MoveY : longint;
LButton, RButton : boolean;
begin
if Code >= 0 then
begin
result := 0;
LButton:=false; RButton:=false;
msg := Pointer(LParam);
case msg.message of
WM_MOUSEMOVE: begin
MoveX:=msg.paramL;
MoveY:=msg.ParamH;
end;
WM_LBUTTONDOWN : LButton:=true;
WM_RBUTTONDOWN : RButton:=true;
end;
if LButton then ObjectScenario.SetCoordinats(MoveX, MoveY);
end else
result:=CallNextHookEx(HookHandle, code, WParam, LParam);
end;
HookHandle:=SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
Digitman (2004-07-21 16:04:00) [8]
> Откуда lParam взялся?
ну догадаться сложно, да ? писал навскидку же ..
Result := CallNextHookEx(0, Code, wParam, DWord(MouseHookStruct));
BRemB (2004-07-21 15:55:00) [9]
> а по каким признакам ты это определил ?
Тестировал.
> CallNextHookEx(0, Code, wParam, lParam);
Откуда lParam взялся?
Digitman (2004-07-21 15:40:00) [10]
> Честно говоря я этого не знаю, эту фишку я увидел в одном
> хэлпе где описывался пример ловушки
это пример того, что не следует бездумно сдирать чужой код .. а уж коль содрал - разберись в нем , что там да к чему ... содрал ты код для WH_KEYBOARD (там lParam действительно является битовым набором) , а пришлепать его решил к WH_MOUSE
> почему ловушка воспринимает левое нажатие клавиши мыши,
> а правое не хочет
а по каким признакам ты это определил ?
в твоем коде масса несуразностей и достаточно серьезных ошибок
пробуй этот тестовый пример :
function MouseHook(Code: integer; wParam: dword; MouseHookStruct: PMouseHookStruct): Longint; stdcall;
begin
try
if HC_ACTION >= 0 then
Case wParam of
WM_RBUTTONDOWN: frmMain.Memo1.Lines.Add('WM_RBUTTONDOWN');
WM_RBUTTONUP: frmMain.Memo1.Lines.Add('WM_RBUTTONUP');
WM_LBUTTONDOWN: frmMain.Memo1.Lines.Add('WM_LBUTTONDOWN');
WM_LBUTTONUP: frmMain.Memo1.Lines.Add('WM_LBUTTONUP');
end;
finally
Result := CallNextHookEx(0, Code, wParam, lParam);
end;
end;
..
HookHandle := SetWindowsHookEx(WH_MOUSE, @Key_Hook, 0, GetCurrentThreadId());
hMod
Identifies the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
dwThreadId
Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads.
BRemB (2004-07-21 15:18:00) [11]
> Digitman
> > lParam and $40000000
Честно говоря я этого не знаю, эту фишку я увидел в одном хэлпе где описывался пример ловушки (Kuliba 1.3.1. от Виталия Озерова). Ну и с этим условие прекрасно выполняется, это мелочи, почему ловушка воспринимает левое нажатие клавиши мыши, а правое не хочет, вот что интересно?!
Digitman (2004-07-21 14:56:00) [12]
> lParam and $40000000
что это еще за бред ?
в lParam в этот момент находится УКАЗАТЕЛЬ на структуру MOUSEHOOKSTRUCT ! Какого ляда ты на указатель маску какую-то накладываешь ?
BRemB (2004-07-21 14:46:00) [13]Суть такая, что из активИкс я импортирую компонент, в нем есть своя менюшка, так вот мне в эту менюшку надо добавить свой пунк меню.
BRemB (2004-07-21 14:33:00) [14]
> показывай код ловушки
//Сама ловушка
function TfrmMain.Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;
begin
Result:=0;
if (Code >= 0) and (lParam and $40000000 = 0) then
begin
Case wParam of
WM_RBUTTONDOWN,
WM_RBUTTONUP: begin
AppendMenu(GetMenu(frmMain.Handle), MF_SEPARATOR, 0, '');
AppendMenu(GetMenu(frmMain.Handle), MF_ENABLED, MU_MenuZulu, 'Привязка');
end;
end;
end else
if Code<0 then Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
end;
//Устанавливаем ловушку
function TfrmMain.InitialHook : boolean;
begin
HookHandle := SetWindowsHookEx(WH_MOUSE, @TfrmMain.Key_Hook, hInstance, GetCurrentThreadId());
if HookHandle = 0 then result:=false else result:=true;
end;
Вместо WM_RBUTTONDOWN, WM_RBUTTONUP пробовал писать VK_RBUTTON - таже история
Digitman (2004-07-21 14:16:00) [15]
> BRemB
показывай код ловушки
BRemB (2004-07-21 14:09:00) [16]да работает норамально.
Digitman (2004-07-21 09:23:00) [17]
> Проблема в том, что ловушка не воспринимает нажатие на правую
> клавишу мыши
а ловушка на нажатие левой клавиши мыши, надо понимать, успешно работает ?
BRemB (2004-07-21 08:55:00) [18]Хорошо, но все-таки как мне тогда поставить ловушку?
Digitman (2004-07-20 17:33:00) [19]
> Я слышал, что ActiveX компоненты используют свое адресное
> пространство памяти
не соответствует действительности
ActiveX-объекты (OCX, DLL) по сути являются внутренними серверами автоматизации и загружаются в адресное пространство процесса-контроллера автоматизации