Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.032 c
7-80316
SlyFox
2003-12-05 08:17
2004.02.25
Запись CD (нужна VCL)!!!


7-80311
alligator
2003-12-05 17:14
2004.02.25
BIOS и CMOS


14-80292
Empleado
2004-02-02 13:43
2004.02.25
Понедельнику посвящается!


14-80203
IronHawk
2004-01-19 15:10
2004.02.25
Народ прикиньте на БК спёрли моего героя! МОЕГО!!!


1-79708
CAHbI4
2004-02-12 19:08
2004.02.25
Создание Page в PageControl





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