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

Вниз

Странности с хуком   Найти похожие ветки 

 
Jack   (2003-12-10 17:57) [0]

Здравствуйте!

Для разминки писал программу управления Winamp`ом с помощью "горячих" клавиш.
В исполняемом модуле загружал DLL, искал Winamp,ставил глобальный хук на клавиатуру и отслеживал разные клавиши и посылал сообщения Winamp`у.
Странность заключается в том, что если прятал главное окно (сворачивл или ShowWindow(hWindow,SW_HIDE)), хук работал, но Winamp не получал сообщения. Начал разбираться и обнаружил, что если главное окно невидимо или теряло фокус, то переменная hWinamp, описание которой находится в DLL, становилась равной 0. Востанавливал окно или передавал ему фокус - hWinamp получало значение хендла Winampa.
В DLL был следующий код:

var flags: array[0..9] of boolean;
hWinamp: THandle;
...
Когда поменял исходный код:

var hWinamp: THandle;
flags: array[0..9] of boolean;
...

то все заработало нормально. Может кто-нибудь объяснить что происходило с переменными?


 
Юрий Зотов ©   (2003-12-11 17:35) [1]

С переменными не происходило ничего. Происходило где-то в другом месте. Например, hWinamp Вы определяете через FindWindow, но в первом случае делали это в Exe, а во втором - перенесли в сам хук. Тогда описанное Вами поведение как раз очень даже возможно.

И есть серьезное подозрение, что CallNextHookEx у Вас не работает.


 
LOX ©   (2003-12-11 18:37) [2]

Делай так:
Play:
h:= FindWindow("Winamp v1.x" ,nil);
if h <>0 then
SendMessage(h,WM_COMMAND , 40045 , 0)
else
Label1.Caption := "Ненайден Winamp!";
-----------
stop:
h:= FindWindow("Winamp v1.x" ,nil);
if h <>0 then
SendMessage(h,WM_COMMAND , 40047 , 0)
else
Label1.Caption := "Ненайден Winamp!";
...
40045 - кнопка плей, 40046 - пауза, а дальше непомню.


 
Jack   (2003-12-16 15:20) [3]

... Происходило где-то в другом месте. Например, hWinamp Вы определяете через FindWindow, но в первом случае делали это в Exe, а во втором - перенесли в сам хук. Тогда описанное Вами поведение как раз очень даже возможно.
В том то и дело, что Winamp искался при инициализации DLL.
Для отладки перед посылкой сообщения Winamp`у выводил MessageBox, в котором выводил hWinamp.
Так вот, если главное окно не в фокусе, MessageBox показывал hWinamp=0. Когда главное окно становилось активным, hWinamp был не 0, и все сообщения принимались нормально(громкость, сл.трек, пауза...).
Когда в описании глобальных (для DLL) переменных поменял местами описание массива и hWinamp, то программа работала без глюков.


 
StAL ©   (2003-12-16 19:28) [4]

Сохраняйте hWinamp и hHook в проецируемом в память файле



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

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

Наверх




Память: 0.47 MB
Время: 0.029 c
4-80345
Mohamed
2003-12-19 02:47
2004.02.25
Pomogite c Button1Click:SetTimer


11-79691
Ajax
2003-06-04 22:17
2004.02.25
TKOLTreeView


14-80250
Cosinus
2004-02-04 15:10
2004.02.25
Регулярные выражения и с чем их едят...


1-79891
Fants
2004-02-10 09:49
2004.02.25
Динамические библиотеки


3-79567
Виталя
2004-01-29 13:47
2004.02.25
Запрос с условием DATE_IN CONTAINING 10.2003 не выполняется