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

Вниз

Ловушки для активИксов   Найти похожие ветки 

 
Rem   (2004-07-20 17:17) [0]

Добренького здоровечка мастера! У меня такая проблема! Есть компоненты ActiveX, я их юзаю в своей проге. Мне необходимо поставить ловушку WH_MOUSE на этот компонент. Проблема в том, что ловушка не воспринимает нажатие на правую клавишу мыши. Я слышал, что ActiveX компоненты используют свое адресное пространство памяти. Как мне поставить ловушку?


 
Digitman ©   (2004-07-20 17:33) [1]


> Я слышал, что ActiveX компоненты используют свое адресное
> пространство памяти


не соответствует действительности

ActiveX-объекты (OCX, DLL) по сути являются внутренними серверами автоматизации и загружаются в адресное пространство процесса-контроллера автоматизации


 
BRemB   (2004-07-21 08:55) [2]

Хорошо, но все-таки как мне тогда поставить ловушку?


 
Digitman ©   (2004-07-21 09:23) [3]


> Проблема в том, что ловушка не воспринимает нажатие на правую
> клавишу мыши


а ловушка на нажатие левой клавиши мыши, надо понимать, успешно работает ?


 
BRemB   (2004-07-21 14:09) [4]

да работает норамально.


 
Digitman ©   (2004-07-21 14:16) [5]


> BRemB


показывай код ловушки


 
BRemB   (2004-07-21 14:33) [6]


> показывай код ловушки

//Сама ловушка
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 - таже история


 
BRemB   (2004-07-21 14:46) [7]

Суть такая, что из активИкс я импортирую компонент, в нем есть своя менюшка, так вот мне в эту менюшку надо добавить свой пунк меню.


 
Digitman ©   (2004-07-21 14:56) [8]


> lParam and $40000000


что это еще за бред ?
в lParam в этот момент находится УКАЗАТЕЛЬ на структуру MOUSEHOOKSTRUCT ! Какого ляда ты на указатель маску какую-то накладываешь ?


 
BRemB   (2004-07-21 15:18) [9]


> Digitman


> > lParam and $40000000

Честно говоря я этого не знаю, эту фишку я увидел в одном хэлпе где описывался пример ловушки (Kuliba 1.3.1. от Виталия Озерова). Ну и с этим условие прекрасно выполняется, это мелочи, почему ловушка воспринимает левое нажатие клавиши мыши, а правое не хочет, вот что интересно?!


 
Digitman ©   (2004-07-21 15:40) [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:55) [11]


> а по каким признакам ты это определил ?

Тестировал.

> CallNextHookEx(0, Code, wParam, lParam);

Откуда lParam взялся?


 
Digitman ©   (2004-07-21 16:04) [12]


> Откуда lParam взялся?


ну догадаться сложно, да ? писал навскидку же ..

Result := CallNextHookEx(0, Code, wParam, DWord(MouseHookStruct));


 
BRemB   (2004-07-21 16:14) [13]


> 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:32) [14]


> нашел у себя ловушку, давно писал, там я использую журнализацию


а зачем тебе глоб.хук ? ты же работаешь с тек.процессом ?


 
BRemB   (2004-07-21 16:38) [15]

Можно исправить на
HookHandle:=SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, 0, GetCurrentThreadId);
будет с текущим


 
BRemB   (2004-07-21 16:49) [16]

Странно, почему она у меня не хочет с тек. процессом работать?


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());


 
Digitman ©   (2004-07-21 17:19) [17]


> почему она у меня не хочет с тек. процессом работать?


локальный хук ставится не на процесс, а на указанный кодовый поток

если окнам, созданным этим код.потоком, не адресованы сообщения польз.ввода (как в случае с WH_JOURNALRECORD), то и ожидать их нечего - не дождешься ты их


 
BRemB   (2004-07-22 10:38) [18]


> не адресованы сообщения польз.ввода

а как мне адресовать сообщения в данном случае?


 
Digitman ©   (2004-07-22 10:59) [19]


> BRemB


никак

при установке хука тебе нужно указать Id того трэда, который создал окно, сообщениями которому ты интересуешься



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

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

Наверх




Память: 0.52 MB
Время: 0.042 c
1-1092803031
Fynjy
2004-08-18 08:23
2004.09.05
Проблемы с Combobox


8-1087415079
Ламо
2004-06-16 23:44
2004.09.05
BLP


14-1092417468
Piter
2004-08-13 21:17
2004.09.05
Тихие исключения


6-1088616086
dream
2004-06-30 21:21
2004.09.05
Как в Twebbrowser отследить и перехватить загрузку файла ?


14-1092725070
VMcL
2004-08-17 10:44
2004.09.05
Конф. Media