Son zamanlarda bu problemle karşılaşıyorum. İyi bir çözüm bulamıyorum ama SetWindowHookEx
'dan önce bir bayrak ve GetAsyncKeyState
kullanıyorum.
BOOL wasDown;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
LPKBDLLHOOKSTRUCT key = (LPKBDLLHOOKSTRUCT) lParam;
if (key->vkCode == VK_SOMETHING) {
switch (wParam) {
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
if (!wasDown) {
// Processing on first key down
wasDown = true;
}
break;
case WM_KEYUP:
case WM_SYSKEYUP:
// Processing on key up
wasDown = FALSE;
break;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
wasDown = GetAsyncKeyState(VK_SOMETHING) < 0;
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
Elbette, bu kod yalnızca bir anahtar için yapar. Birden çok tuş yapmak için bir dizi bayrak kullanabilirsiniz. Uygulamanıza bağlı olarak, kancanızın ayarlanmasından sonra ilk basışını isterseniz, kayıtsız şartsız olarak bayrağı false
'a ayarlayabilirsiniz.
Klavye kancalarıyla ilgili birçok sorundan biri, klavye durumu işlem başına bir özelliktir. Yani tamamen aldığınız şey, ön plan penceresine sahip olmak için hangi işlemin gerçekleştiğine ve * anahtarın daha önce anahtarı görüp görmediğine bağlıdır. –
Biliyorum, ama bu durumda umrumda değil. Kullanıcının sadece sürecime odaklanmasını beklerim, fakat riskin farkındayım, teşekkürler! –
@Hans Klavye durumu, iş parçacığı başına denetlenir (veya bir çok iş parçacığı, 'AttachThreadInput' çağrısının sonucu olarak birbirine bağlanmışsa, iş parçacığı grubu). * Iş parçacığı * işleminin tüm oluşumlarını * iş parçacığı veya iş parçacığı grubu * ile değiştirmek, yorumunuzu düzeltir. – IInspectable