Сообщение от
form
пусть разбирается.
Мне начинает казаться, что вполне можно обойтись без взаимодействия всех запущенных экземпляров программы с общим глобальным хуком - ведь когда окно теряет фокус оно может отключать свой глобальный хук, а когда получает фокус - подключать. Т.к. фокус во всей системе может иметь только одно окно - уникальность подключенного глобального хука будет гарантирована.
---------- Post added at 11:22 ---------- Previous post was at 11:12 ----------
Если каждое окно, в котором хочется отключить реакцию Windows на NumLock будет при получении фокуса устанавливать:
Код:
ghKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardHook, ghInstance, 0);
а при потере фокуса отключать такой глобальный хук:
Код:
LRESULT CALLBACK KeyboardHook( int nCode, WPARAM wp, LPARAM lp )
{
static bool bVK_NUMLOCK_pressed = false;
KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lp;
dword wParam = pkh->vkCode;
dword lParam = 1;
dword lParamHi = pkh->scanCode;
signed char cFlags = pkh->flags;
if( cFlags & 1 )
{
lParamHi |= BIT_8;
}
if( cFlags < 0 )
{
lParamHi |= BIT_14;
lParamHi |= BIT_15;
}
if( nCode == HC_ACTION )
{
if( wParam == VK_NUMLOCK )
{
if( cFlags < 0 )
{
bVK_NUMLOCK_pressed = false;
lParamHi <<= 16;
lParam |= lParamHi;
PostMessage( hWnd, WM_KEYUP, wParam, lParam );
}
else
{
if( bVK_NUMLOCK_pressed ) { lParamHi |= BIT_14; }
bVK_NUMLOCK_pressed = true;
lParamHi <<= 16;
lParam |= lParamHi;
PostMessage( hWnd, WM_KEYDOWN, wParam, lParam );
}
return 1;
}
}
return CallNextHookEx( ghKeyboardHook, nCode, wParam, lParam );
}
то проблемы конкуренции глобальных хуков между собой не возникнет.
...
Небольшая сложность есть только с тем, что сообщения о получении фокуса в новое окно и об утрате фокуса в старое окно приходят без гарантированной последовательности. Поэтому, при использовании общего кода хука несколькими окнами - они перед установкой хука должны записывать свой hWnd в глобальную статическую переменную hWnd, которую использует хук, но перед удалением хука эту переменную не трогать, т.к. там уже может быть hWnd другого окна, которое уже установило другой экземпляр этого же хука.