Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.036 c
14-1092668010
Паскальные надписи
2004-08-16 18:53
2004.09.05
Генератор случайных чисел


8-1087242022
DimDim
2004-06-14 23:40
2004.09.05
TRxGIFAnimator и проблемы с ним


4-1090302822
acidman
2004-07-20 09:53
2004.09.05
LPT под win2k/XP/NT


14-1092327885
y-soft
2004-08-12 20:24
2004.09.05
Windows XP SP2 Первые впечатления


1-1092855479
Vemer
2004-08-18 22:57
2004.09.05
Как отключить некоторые предупреждения.





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