最初に押されたキーを調べるには?

このQ&Aのポイント
  • CTRLを押しながらAを押した場合だけメッセージボックスを表示するように変えたい
  • 2つのキーが押されている時に最初に押されたキーを調べる方法がわかりません
  • Microsoft Visual C++ 2010 ExpressでのWIN32 ユニコードビルド環境でのC言語のプログラム
回答を見る
  • ベストアンサー

最初に押されたキーを調べるには?

下のプログラムではCTRLを押しながらAを押しても、Aを押しながらCTRLを押してもメッセージボックスが表示されます。 これをCTRLを押しながらAを押した場合だけメッセージボックスを表示するように変えたいのですが、2つのキーが押されている時に最初に押されたキーを調べる方法がわかりません。 どうすればいいでしょうか? case WM_KEYDOWN: if( (GetKeyState(VK_CONTROL)<0) && (GetKeyState(0x41)<0)){ MessageBox(hWnd,TEXT("CTRL+Aが押されました。"),TEXT("テスト"),MB_OK); } --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

WM_KEYDOWNメッセージを発生させたキーのデータはwParamに入っています。これがVK_CONTROLであればCtrlキーが押されたと判定できます。 Ctrlキーが押されたときのWM_KEYDOWNは何も処理せずに、Aキーが押されたときのみCtrlキーの状態を判定して、処理を行えば解決できると思います。 Aキーを押しっぱなしにすると、WM_KEYDOWNが複数発生しますが、その場合はlParamのbit30を調べて、0の場合が初回のWM_KEYDOWNと判断できます。

nazoda
質問者

お礼

回答ありがとうございました。プログラムを下のように変更したら無事解決しました。 if(wParam==0x41){  if(GetKeyState(VK_CONTROL)<0){MessageBox(hWnd,TEXT("CTRL+Aが押されました。"),TEXT("テスト"),MB_OK); }  }

その他の回答 (1)

  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.1

if(GetKeyState(VK_CONTROL)<0)){ if (GetKeyState(0x41)<0){ MessageBox(hWnd,TEXT("CTRL+Aが押されました。"),TEXT("テスト"),MB_OK); } } こうしたらどうでしょう?

nazoda
質問者

お礼

回答ありがとうございました。その方法は一番最初に試したのですが、うまくいかなかったです。

関連するQ&A

  • UWSCの仮想キーについて

    if GETKEYSTATE(VK_F1) then 例えば GETKEYSTATEで CtrlキーとF1キーを同時に押されている時にthenとしたい場合 どう表現したら良いのでしょうか? if GETKEYSTATE(VK_F1&VK_CTRL) thenとなるのでしょうか? それとも KBD(VK_CTRL,DOWN,秒) KBD(VK_F1,CLICK,秒) KBD(VK_CTRL,UP,秒) のような表記でしか使えないのでしょうか?

  • テキストボックスからフォーカス外す

     editBox = CreateWindow(   "EDIT",   "あああ",   SS_CENTER | WS_CHILD | WS_VISIBLE,   0,0,100,20,   hWnd,   NULL,   hInstance,   NULL); テキストボックスのフォーカスを外すにはどうしたら いいんですか? ESCキーでフォーカスを外そうと思ったら、 テキストボックスにフォーカスがあるせいで case WM_KEYDOWN が動作しません。 フォーカスを外すというソース自体も分かっていません。  case WM_KEYDOWN:   if( wParam == VK_ESCAPE )    ?  break;

  • キーコードとAltキー

    矢印キーのVK_UPが押された時、Altキーも押されているかを調べたいのですが、どうしたらよいですか? DLLはできるだけ使いたくありません。 case WM_KEYDOWN:  if(wParam == VK_UP){   if(Alt){   }  }

  • WM_KEYDOWNでPrtScを捕まえる方法??

    ごく普通のウィンドウプロシージャでキーの判別を行っています 下記のように条件(1)が WM_KEYUP の際には(2)、(3)ともに検出します LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_KEYUP: ............ (1) switch(wp) { case VK_RETURN: { break; } ..... (2) case VK_SNAPSHOT: { break; } ..... (3) default: { break; } } break; } return; ところが条件(1)を WM_KEYDOWN に変更すると(2)の Enter は検出しますが、(3)の PrtSc を検出してくれません 質問1 なぜ PrtSc を WM_KEYDOWN では検出しないのですか? 質問2 WM_KEYUP WM_KEYDOWN のいずれか一方にしか反応しないキーはまだありますか? 質問3 どのようにしたら PrtSc の WM_KEYDOWN を捕まえることが出来ますか? 自分でも調べてみましたが、どうも判然と致しません 宜しくご指導のほどお願い申し上げます

  • Excel VBAでIE「ダウンロードの表示」生成

     Internet Explorer で、「ダウンロードの表示」のDialogウィンドウをショートカット(Ctrl + J )を使って表示させたいのですが、Excel VBA で以下のコードで試したのですが、うまくいきません。どういうコードを書いたらよいのでしょうか?アクセスキーを使った方法では、「ツール」で N  に該当するのが「ダウンロードの表示」と「Send To Note」の2つあって起動できません。  よろしくお願いします。 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Public Const WM_KEYDOWN = &H100 Public Const WM_KEYUP = &H101 Public Const VK_CONTROL = &H11 Public Const VK_J = &H4A Public Const navOpenInNewTab = &H800 Sub Test() Dim objIE As Object Dim hWnd_objIE As Long Dim Ret As Long 'IE起動 Set objIE= CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "https://www.google.co.jp/", navOpenInNewTab Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop 'objIEのhWnd取得 hWnd_objIE = objIE.hwnd 'IEの親ウィンドウのhWnd取得する 'hWnd_objIE のウィンドウにPostMessageする Ret = PostMessage(hWnd_objIE, WM_KEYDOWN, VK_CONTROL, 0) Ret = PostMessage(hWnd_objIE, WM_KEYDOWN, VK_J, 0) Sleep 100 Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_CONTROL, 0) Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_J, 0) End Sub

  • VC++でCtrl+Vを操作させたい

    VC++のプログラミングで、他のアプリケーションを操作するものを作っているのですが、そこでテキストスペースにCtrl+Vでの張り付けを操作させたいのですが、うまくいきません。 SendMessage(hWndSysLV, WM_KEYDOWN, VK_CONTROL, 0); SendMessage(hWndSysLV, WM_KEYDOWN, 0x56, 0); SendMessage(hWndSysLV, WM_KEYUP, VK_CONTROL, 0); SendMessage(hWndSysLV, WM_KEYUP, 0x56, 0); では不可能なようなのですが、何か方法がありましたらアドバイスいただけるとありがたいです。

  • メッセージボックスが何度も表示される理由は?

    スクロールバーを作り下のプログラムのようにSB_LINEDOWN:の所でメッセージボックスを表示するとなぜかメッセージボックスが何個も表示されてしまいます(20個ぐらい)。しかも表示される個数が変わる時もあります。 メッセージボックスを表示する行を消し、実行される回数をカウントする変数を記入してデバッグしてみると正常に1回実行されているようです。 SB_ENDSCROLLの中で表示した場合も正常に1回だけ表示されます。 どうしてこうなるのでしょうか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語 case WM_VSCROLL: switch(LOWORD(wParam)){ case SB_LINEDOWN: MessageBox(hwnd,TEXT("スクロールバーのテスト中"),TEXT("メッセージボックス"),MB_OK); break; } break;

  • チェックボックスのキーダウン時に矢印キーを検知する方法について

    チェックボックスのキーダウン時に矢印キーを検知する方法について VB6のチェックボックスについて質問させて頂きます。 環境   Windows 2000 SP4   Visual Basic 6.0(SP6) チェックボックスのキーダウン時に矢印キーを検知する方法について、ご存知の方がいらっしゃいましたら、ぜひ教えて頂きたいです。 自分なりに調べてみた結果は以下の通りです。 チェックボックスのKeyDownイベントでは矢印キーは検知できませんでした。 次に試したのが、サブクラス化を行い、WM_KEYDOWNを取得する方法です。 正直、サブクラス化を行えば矢印キーを確実に検知できると考えていたのですが、なぜか矢印キーを押してもWM_KEYDOWNメッセージを取得できず、このため矢印キーの検知ができませんでした。 矢印キー以外のキー、例えばAやSなどは問題なく検知できました。 ちなみに、この状態でSpy++を起動し、矢印キーを押したときのメッセージを確認してみると、チェックボックスウィンドウはきちんとWM_KEYDOWNを受け取っていました。 それなのにサブクラス化した方ではWM_KEYDOWNは取得できません。 まだ完全にサブクラス化の概念を理解している訳ではないため、恐らく何か原因があるのでしょうが、想像ができないでいます。 ( Windowsから送られるメッセージがチェックボックスウィンドウに届くまでの間に誰がメッセージを処理してるのかが分かりません。自分は間に何もないと考えていました )。 この動作についても知っている方がいたら、説明して頂けるととても助かります。 すいませんが、ご教授お願い致します。

  • VC++のLV_KEYDOWNについて

    キーボードのショートカット処理の関数を作成しているのですが、Ctrl + sでデフォルトの保存処理ではなく 別の処理を作成したいと考えております。 ですが下記のように実装してもCtrl + sを検出できません。(Ctrl + a)は検出するのですが。 何か原因があるのでしょうか? ご存知の方がいましたらご教授いただけないでしょうか? void OnKeydown(NMHDR* pNMHDR, LRESULT* pResult) { LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR; SHORT nCtrl = 0; switch(pLVKeyDow->wVKey) { case 's': case 'S': nCtrl = GetKeyState(VK_CONTROL); if(nCtrl >= 0) { // Ctrlキーが押下されていない場合 break; } // Ctrl + sの処理 break; case 'a': case 'A': nCtrl = GetKeyState(VK_CONTROL); if(nCtrl >= 0) { // Ctrlキーが押下されていない場合 break; } // Ctrl + aの処理 break; } *pResult = 0; }

  • UWSCでキー入力を変数に代入する方法

    IFB GETKEYSTATE(VK_CTRL) PRINT "Ctrlキーが入力されたよ" ENDIF という風に決め打ちで何が押されたか確認する方法は分かったのですが、 SELECT KeyInput CASE VK_CTRL PRINT "Ctrlキーが入力されたよ" CASE VK_ESC PRINT "Escキーが入力されたよ" SELEND というように変数にキー入力を代入してから比較する方法が分かりません。 キー入力を変数に代入する方法はあるのでしょうか?