Главная страница
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.046 c
1-79857
Builder
2004-02-09 23:13
2004.02.25
Формы в dlls


4-80349
LOMic
2003-12-18 10:32
2004.02.25
Здравствуйте. Как получить HWND для SpeedButton ?


1-79755
Санек
2004-02-12 09:57
2004.02.25
Свой значок при создании компонента


7-80329
xtz
2003-12-04 01:28
2004.02.25
Автозапуск


14-80231
Alexander666
2004-02-05 03:50
2004.02.25
США и наша внутренняя политика.