Форум: "WinAPI";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c