プログラムの起動時にShift、Control、 &キーのさまざまな組み合わせが押されたかどうかを検出する必要があります。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 行は、結果をまったく変更せずに削除できることに注意してください。プログラムが実際に実行されている間にキーが押されたことを確認できるように、それらを追加しました。