これは私の最初の質問の続き です。DX11 ゲーム中に D3D10SDKLayers.dll が読み込まれるのはなぜですか? 私は DX11 ゲームを作成しており、低レベルの Windows キー フックを使用して Alt+Enter をキャプチャしているため、必然的に問題が発生する Windows に自動的に行わせるのではなく、独自の方法を使用してフルスクリーンを切り替えることができます。このプロセスの説明と詳細は、リンクされた質問で入手できます。私の問題は、なんらかの理由で 6 回目の Alt+Enter の後、キーフックが一貫して機能しなくなることです。私は自分で登録を解除していません。
キーフックのコードは次のとおりです。
LRESULT _stdcall MyClass::WindowsKeyHook( s32 nCode, WPARAM wParam, LPARAM lParam ) {
printf("Key hook called, nCode: %d. ", nCode);
if( nCode < 0 || nCode != HC_ACTION ) { // do not process message
return CallNextHookEx( MyClassVar.GetWindowsKeyHook(), nCode, wParam, lParam );
}
printf(" Key hook status ok.\n");
BOOL bEatKeystroke = FALSE;
KBDLLHOOKSTRUCT* p = ( KBDLLHOOKSTRUCT* )lParam;
switch( wParam ) {
//NOTE: Alt seems to be a system key when it is PRESSED, but a regular key when it is released...
case WM_SYSKEYDOWN:
if(p->vkCode == VK_MENU || p->vkCode == VK_LMENU || p->vkCode == VK_RMENU) {
MyClassVar.SetAltPressed(TRUE);
}
if(MyClassVar.IsAltPressed() && p->vkCode == VK_RETURN) {
bEatKeystroke = TRUE;
MyClassVar.SetAltEnterUsed(TRUE);
printf("Alt+Enter used.\n");
}
break;
case WM_SYSKEYUP:
//NOTE: releasing alt+enter causes a SYSKEYUP message with code 0x13: PAUSE key...
break;
case WM_KEYDOWN:
break;
case WM_KEYUP: {
if(p->vkCode == VK_MENU || p->vkCode == VK_LMENU || p->vkCode == VK_RMENU) {
MyClassVar.SetAltPressed(FALSE);
}
bEatKeystroke = ( !MyClassVar.IsShortcutKeysAllowed() &&
( p->vkCode == VK_LWIN || p->vkCode == VK_RWIN ) );
break;
}
}
if( bEatKeystroke ) {
return 1;
}
else {
return CallNextHookEx( MyClassVar.GetWindowsKeyHook(), nCode, wParam, lParam );
}
}
さらに情報が必要な場合は、必要なものを教えてください。なぜこれが起こっているのかわからないので、どのような情報を提供する必要があるのか わかりません. 私の知る限り、キーフックを明示的に登録解除する以外にキーフックを取り除く唯一の方法は、Windows がタイムアウトした場合です。すべての MyClassVar メソッドはインラインで可能な限り高速になり、Alt+Enter は別のスレッドから処理されます。