1

プログラムの起動時にShiftControl、 &キーのさまざまな組み合わせが押されたかどうかを検出する必要があります。Altこれは、ウィンドウが開かれる前に発生する必要があります。

GetAsyncKeyStateについてはすべて知っていますが、プログラムが Windows のフォアグラウンド タスクでない場合、この関数は機能しません。また、プログラムが最初に起動されたとき、ウィンドウが開かれるまでフォアグラウンド タスクではありません。

プログラムは WIN32/C++/MFC/32 ビットです。何か案は?


追加情報が追加されました: これは 64 ビット Win8 で実行されています。また、GetAsyncKeyStateについてのみ言及しましたが、 GetKeyStateも試しましたが、結果はCURRENTステータスを実際には反映しておらず、まったく機能しませんでしたAlt

メイン ウィンドウが開かれる前に、アプリ クラスのInitInstanceメソッド (基本的には MFC アプリの main() です)から取得したコード例を次に示します。

#define USE_GETASYNCKEYSTATE (1)

// Following two lines are added for testing so there's a
// specific time to make sure keys are pressed
AfxMessageBox("Press keys after dismissing this message");
Sleep(2000);

#if USE_GETASYNCKEYSTATE
    short altKeyStatus = GetAsyncKeyState(VK_MENU) & 0x8000;
    short shiftKeyStatus = GetAsyncKeyState(VK_SHIFT) & 0x8000;
    short controlKeyStatus = (short)GetAsyncKeyState(VK_CONTROL) & 0x8000;
#else
    char kbBuf[256];
    GetKeyboardState( (PBYTE)kbBuf );
    short altKeyStatus = (short)kbBuf[VK_MENU];
    short shiftKeyStatus = (short)kbBuf[VK_SHIFT];
    short controlKeyStatus = (short)kbBuf[VK_CONTROL];
#endif

CString msg;
msg.Format("ALT: %d, SHIFT: %d, CTRL: %d", 
                altKeyStatus, shiftKeyStatus, controlKeyStatus );
AfxMessageBox(msg);

GetAsyncKeyStateを使用して実行すると、3 つの変数すべてが常に 0 を返します。

GetKeyboardStateブロックを実行すると、Shiftおよび/またはControlが押されたことを示す結果が得られることがあります。つまり、最近押されましたが、必ずしも現在のステータスと一致するとは限りませんAlt

Sleepを含む最初の 2 行は、結果をまったく変更せずに削除できることに注意してください。プログラムが実際に実行されている間にキーが押されたことを確認できるように、それらを追加しました。

4

2 に答える 2

2

いいえ、あなたはそれを逆にしました。それはうまくGetKeyState()いきませんGetAsyncKeyState()GetKeyState()キーボードのバッファリングされた状態を返すため、通常は使用する必要があります。キーボード メッセージはメッセージ キューにバッファリングされるため、重要です。しかし、プログラムがフォーカスを持っていないか、メッセージ キューをまだ作成していない場合、それは機能しません。後者はあなたの場合です。

マジック キーは慎重に選択してください。デスクトップ ショートカットをクリックする際に邪魔になる傾向があります。この種の場合、Scroll Lock キーが役立つことがわかりました。ほとんど何にも使用されません。通常、ライトもあり、状態をラッチするため、キーボードをパニックに陥らせることなくオンにできます。

于 2013-04-21T22:28:26.007 に答える