![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странности с хуком [D6, Win2k]
Jack © (2003-12-10 17:57:00)
Здравствуйте!
Для разминки писал программу управления 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;
...
то все заработало нормально. Может кто-нибудь объяснить что происходило с переменными?
StAL (2003-12-16 19:28:00) [1]
Сохраняйте hWinamp и hHook в проецируемом в память файле
Jack (2003-12-16 15:20:00) [2]
... Происходило где-то в другом месте. Например, hWinamp Вы определяете через FindWindow, но в первом случае делали это в Exe, а во втором - перенесли в сам хук. Тогда описанное Вами поведение как раз очень даже возможно.
В том то и дело, что Winamp искался при инициализации DLL.
Для отладки перед посылкой сообщения Winamp`у выводил MessageBox, в котором выводил hWinamp.
Так вот, если главное окно не в фокусе, MessageBox показывал hWinamp=0. Когда главное окно становилось активным, hWinamp был не 0, и все сообщения принимались нормально(громкость, сл.трек, пауза...).
Когда в описании глобальных (для DLL) переменных поменял местами описание массива и hWinamp, то программа работала без глюков.
LOX (2003-12-11 18:37:00) [3]
Делай так:
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 - пауза, а дальше непомню.
Юрий Зотов (2003-12-11 17:35:00) [4]
С переменными не происходило ничего. Происходило где-то в другом месте. Например, hWinamp Вы определяете через FindWindow, но в первом случае делали это в Exe, а во втором - перенесли в сам хук. Тогда описанное Вами поведение как раз очень даже возможно.
И есть серьезное подозрение, что CallNextHookEx у Вас не работает.