Форум: "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.032 c