VCL и SetWondowsHookEx
Если MainForm->Visible = true, свернуть и если false развернуть. В методе FormHide ставлю вызов:
Код:
hk = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)_KeyHook,dllKeyHookModID,0);
hk получает handler, но процедура обработки не вызывается. Процедура обработки находится в отдельной dll.
Код:
hk = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)_KeyHook,NULL,0);
Причем если делать Hook в активной форме все работает. Такое ощущение, что TApplication перехватывает этот Hook и заменяет его своим оброботчиком, а по методу Hide() делает UnhookWindowsHookEx. Вобщем я чего-то, где-то не догоняю.
ЗЫ: Оговорюсь сразу - VCL проект это важно. Необходимо решение именно для VCL, если оно вообще есть.
Вот мой код:
Код:
TForm1 *Form1;
HHOOK hk;
HINSTANCE dllKeyHookModuleId;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
dllKeyHookModuleId = LoadLibrary("Project2.dll");
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
UnhookWindowsHookEx(hk);
}
void __fastcall TForm1::FormHide(TObject *Sender)
{
hk = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)_KeyHook,dllKeyHookModuleId,0);
SetHk(hk,Handle);
}
HHOOK hk;
HINSTANCE dllKeyHookModuleId;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
dllKeyHookModuleId = LoadLibrary("Project2.dll");
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
UnhookWindowsHookEx(hk);
}
void __fastcall TForm1::FormHide(TObject *Sender)
{
hk = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)_KeyHook,dllKeyHookModuleId,0);
SetHk(hk,Handle);
}
ЗЫЫ: Прошу прощения за ошибку в названии темы. Рука дрогнула.
Цитата:
Originally posted by AlexandrVSmirno
В VCL проекте в CBuilder v6.0 мне необходимо сворачивать и разворачивать приложение по нажатию комбинаций клавишь Alt+F2 в зависимость от состояния главной формы MainForm.
В VCL проекте в CBuilder v6.0 мне необходимо сворачивать и разворачивать приложение по нажатию комбинаций клавишь Alt+F2 в зависимость от состояния главной формы MainForm.
А нажатие ALT+F2 должно действовать глобально или только в пределах твоей программы?
Цитата:
Originally posted by smartsoft
А нажатие ALT+F2 должно действовать глобально или только в пределах твоей программы?
А нажатие ALT+F2 должно действовать глобально или только в пределах твоей программы?
Глобально.
Цитата:
Originally posted by AlexandrVSmirno
Глобально.
Глобально.
Я так понимаю тему можно закрыть. Мыслей свежих нет ни у кого, включая и меня. WinAPI - шники откликнитесь. Может ВЫ что присоветуете?
Цитата:
Originally posted by AlexandrVSmirno
Такое ощущение, что TApplication перехватывает этот Hook и заменяет его своим оброботчиком, а по методу Hide() делает UnhookWindowsHookEx.
Такое ощущение, что TApplication перехватывает этот Hook и заменяет его своим оброботчиком, а по методу Hide() делает UnhookWindowsHookEx.
Только не говори, что нет под рукой исходников или не знаешь Паскаля. Новички подобными вопросами не задаются.
Только что посмотрел в исходнике Forms.pas - TApplication действительно заменяет хук на собственный для обработки хинтов. Там еще какая-то хрень с потоками используется. Только разбираться непосредстенно не стал...
На твоем бы месте я бы давно расковырял бы исходники VCL и попробовал бы обойти проблему.
чтобы ХУК работал не только когда активна форма твоей программы, НУЖНО этот ХУК загружать из библиотеки ( DLL) - может вопрос в способе ее загрузки -статический /динамический ?
Что-то я не нашел в твоем коде GetProcAddress...
см. про библиотеки здесь:
http://www.firststeps.ru/cbuilder/r.php?92
http://www.firststeps.ru/cbuilder/r.php?91
http://www.firststeps.ru/mfc/winapi/r.php?152
Цитата:
Originally posted by smartsoft
Только не говори, что нет под рукой исходников или не знаешь Паскаля. Новички подобными вопросами не задаются.
На твоем бы месте я бы давно расковырял бы исходники VCL и попробовал бы обойти проблему.
Только не говори, что нет под рукой исходников или не знаешь Паскаля. Новички подобными вопросами не задаются.
На твоем бы месте я бы давно расковырял бы исходники VCL и попробовал бы обойти проблему.
Критику принимаю и приступаю к действиям.