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

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

Hook мыши


volser ©   (2003-11-06 12:23:00) 

(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.


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

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


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


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


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


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


> case wParam of
> WM_LBUTTONUP :
> begin


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


Digitman   (2003-11-18 16:31:00) [4]

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


> volser


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

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

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


VMcL   (2003-11-18 16:15:00) [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;


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

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


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

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


VMcL   (2003-11-07 14:39:00) [8]

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

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


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

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


Наверх

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