これは私の元の質問 Why is D3D10SDKLayers.dll loaded during my DX11 game?私はDX11ゲームを作成していますので、私は自分のメソッドを使用しての代わりに、Windowsが自動的にそれを行う持つフルスクリーン切り替えができることをAltキー+ Enterキーをキャプチャするために、低レベルのウィンドウキーフックを使用していますの続きです必然的に問題を引き起こす。このプロセスと詳細の説明は、リンクされた質問に記載されています。私の問題は、何らかの理由で6回目のAlt + Enterの後にキーフックが一貫して機能しなくなることです。私は自分自身を登録解除していません。ここで低レベルのWindowsキーフックが機能しなくなるのはなぜですか?
はキーフックコードです:あなたはより多くの情報が必要な場合
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は別のスレッドから処理されます。
私はここで混乱している「Windowsは、必然的に問題を引き起こす、自動的にそれを行います」。だからあなたは自分のキーボードフックを書くことで何を避けたのですか? –
@ todda.speot DX11ゲームでAlt + Enterを押すと、ウィンドウは自動的にフルスクリーンモードをトグルします。フロントバッファの解像度をデスクトップ解像度に設定します。これは、ゲームを640x480で実行したい場合は間違っています。これを避けるために、私はAlt + Enterキーをキャッチし、完全に動作する独自のToggleFullscreen()メソッドを実行するためのキーフックを設定しました。 – Darkhydro
私は私の答えですこぶることをしました。 –