Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ловушки для активИксов [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) по сути являются внутренними серверами автоматизации и загружаются в адресное пространство процесса-контроллера автоматизации


Наверх

Титульная страница Поиск, карта сайта Написать письмо