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

Вниз

Hook мыши   Найти похожие ветки 

 
volser   (2003-11-06 12:23) [0]

(WinXP)Объясните кто может. Почему используя данный код программы не срабатывает левый и правый клики на панели задач, а именно на панели приложений, на системных часах и на панели где находится кнопка "пуск". Кто знает как от этого избавиться напишите. Под Win98 работает только левый клик.


library dllLib;

uses
windows, dialogs, sysutils,
messages;

var
H : THandle;

{Hook-функция}
function hook(c0de, wParam, lParam : integer): Lresult; stdcall;
{Объявления переменных}
var
w : THandle;
hw : hwnd;
begin
{Если c0de не меньше 0, все в порядке, продолжаем}
if c0de >= 0 then
begin

case wParam of
WM_LBUTTONUP :
begin
W:= FindWindow("Shell_TrayWnd", nil);
W:= FindWindowEx(W, HWND(0),"Button", nil);
ShowWindow(W, SW_hide);
end;
{ Если wParam = WM_LBUTTONUP, т.е. нажата левая кнопка мыши, получаем
хендл кнопки пуск и показываем ее }
WM_RBUTTONUP:
begin
W:= FindWindow("Shell_TrayWnd", nil);
W:= FindWindowEx(W, HWND(0),"Button", nil);
ShowWindow(W, SW_SHOW);
end;
{ Если wParam = WM_MBUTTONUP, т.е. нажата средняя кнопка мыши, получаем
указатель на заголовок активного окна и изменяем его }
WM_MBUTTONUP:
begin
hw:=GetForegroundWindow;
SetWindowText(hw,"EXAMPLE OF WINDOWS HOOK (WH_MOUSE) - by Dark Lord <darklord@smtp.ru>");
end;
end;
end else
{Если c0de меньше 0}
begin
{Вызываем следующую ловушку в цепочке ловушек Windows и выходим из процедуры}
result := CallNextHookEx(H, c0de, wParam, lParam);
exit;
end;
{Вызываем следующую ловушку в цепочке ловушек Windows}
result := CallNextHookEx(H, c0de, wParam, lParam);
End;

{ Процедура установки ловушки, если не удалось
установить - выводим сообщение об ошибке }
procedure sethook;
begin
H:= SetWindowsHookEx(WH_MOUSE, @hook, hInstance, 0);
if H = 0 then
messagebox(0,"hmmm..","ERROR",mb_iconhand);
end;

{ Процедура удаления ловушки }
procedure removehook;
begin
UnhookWindowsHookEx(H);
end;

{ Экспорт процедур установки и удаления hook"a }
exports
sethook index 1 name "sethook",
removehook index 2 name "removehook";
end.


 
volser   (2003-11-07 01:40) [1]

Удалено модератором
Примечание: Создание пустых сообщений


 
VMcL ©   (2003-11-07 14:39) [2]

Думаю, что Explorer тоже ставит хук.

P. S. В моей программе MacTray тоже при клике на панели задач не срабатывает перехват.


 
volser   (2003-11-08 10:40) [3]

Удалено модератором
Примечание: Без наездов


 
Alternative   (2003-11-18 16:10) [4]

Прикол хотите
Попробовал этот код и знаете что случилось? Кнопку ПУСК сдуло как ветром...


 
VMcL ©   (2003-11-18 16:15) [5]

->Alternative (18.11.03 16:10) [4]

Логично, см. внимательно:

WM_LBUTTONUP :
begin
W:= FindWindow("Shell_TrayWnd", nil);
W:= FindWindowEx(W, HWND(0),"Button", nil);
ShowWindow(W, SW_hide);
end;


 
Digitman ©   (2003-11-18 16:31) [6]

да ну ЕКЛМН !!!
статьи по глоб.хукам здесь читает хоть кто-нибудь, а ?!


> volser


ты репу не разу не чесал, вызвав первым делом в процедуре hook() ф-цию

MessageBox(0, PChar(IntToStr(H)), "hook handle value", mb_ok)

и озадачившись не на шутку тем, что H с какого-то перепугу вдруг = 0 ???


 
Дубинин Алексей ©   (2003-11-18 21:23) [7]


> case wParam of
> WM_LBUTTONUP :
> begin


Как это никто не знает. Я знаю. Лови плюс к WM_LBUTTONUP еще и WM_ NCLBUTTONUP, т.е. Non Client. Теперь будет ловиться и на панели задач и на заголовке окна.
Хелп внимательнее смотреть иногда тоже полезно. :-))


 
volser   (2003-12-21 18:37) [8]


> Как это никто не знает. Я знаю. Лови плюс к WM_LBUTTONUP
> еще и WM_NCLBUTTONUP, т.е. Non Client. Теперь будет ловиться
> и на панели задач и на заголовке окна.
> Хелп внимательнее смотреть иногда тоже полезно. :-))


Не все так работает как хотелось. Левая клавиша работает правильно, а при нажатии правой вылетает PopupMenu и событие дальше не срабатывает. Может для правой клавиши нужно ловить другой месыдж?


 
Diamond Cat ©   (2003-12-22 00:06) [9]

все правильно, все должно работать, только проблемка у тебя в том, что ты задал слишком жесткое условие а именно "Shell_TrayWnd", фишка вся в том что поверх этого окна набросано куча дочерних элементов, таким образом ты кликаешь на них а не на "Shell_TrayWnd", собственно вот и вся загвоздка, я думаю самый простой способ выйти из создавшейся ситуации это рекурсивно , с помощью getwindow или getparent, просмотреть на предмет парентовости до самого верхнего окна данной цепочки каждый клик (мда написал и задумался)если верхним будет "Shell_TrayWnd" значит клик произошел "на нем"
хотя вот еще способ (только щаз придумал) найди регион от "Shell_TrayWnd" и сверяй произошел-ли клик в данном регионе если да, то ЕСТЬ ВЕРОЯТНОСТЬ!!! что клик был на нем



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
1-93960
OlimPer
2004-02-16 22:03
2004.02.29
ShellListView


6-94084
kkostik
2003-12-17 11:01
2004.02.29
API Internet


6-94051
Alexis
2003-12-24 19:30
2004.02.29
поймать исключение...


14-94118
syte_ser78
2004-02-09 14:55
2004.02.29
перевод каретки


1-93898
Tatyana
2004-02-16 00:37
2004.02.29
Событие.