Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-93774
EugenePichugin
2004-02-03 18:11
2004.02.29
Вызов хранимой процедуры Oracle из Delphi


14-94126
Undert
2004-02-07 14:45
2004.02.29
PHP Config


14-94193
mfender
2004-02-06 00:30
2004.02.29
Полнолуние....


1-94004
OlegM
2004-02-17 08:11
2004.02.29
Как открыть файл в своем приложении


1-93863
Leech
2004-02-16 14:41
2004.02.29
Парсим ошибки от StrToInt()





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