• 締切済み

キーコードとAltキー

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

みんなの回答

noname#39970
noname#39970
回答No.2

http://wisdom.sakura.ne.jp/system/winapi/win32/win32.html No1と同じとこにあるやつだけど 右altと左altで別に取れるみたいだよ

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・WM_KEYDOWN ではなく WM_SYSKEYDOWN 内で VK_UP をチェックしてみてはどう。  http://wisdom.sakura.ne.jp/system/winapi/win32/win30.html→『キーボードイベント』  ↑下の方に『これは Alt と他のキーで生成されるメッセージです』となっています。 ・以上。参考に!

参考URL:
http://wisdom.sakura.ne.jp/system/winapi/win32/win30.html

関連するQ&A

  • Alt+P,Alt+NをPostmessageで送るには

    あるアプリがあり、そのハンドルを取得してからメッセージを送るプログラムを作っています。 PageUp,PageDownをそれぞれAlt+P,Alt+Nに変換して送るものです。 関数・定数宣言部は省略しています。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)   Dim hTest As Long   hTest = FindWindow(vbNullString, "Test")   If KeyCode = 33 Then 'PageUp     PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0     PostMessage MPL, WM_KEYDOWN, VK_N, 0     PostMessage MPL, WM_KEYUP, VK_N, 0     PostMessage MPL, WM_SYSKEYUP, VK_ALT, 0   ElseIf KeyCode = 34 Then 'PageDown     PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0     PostMessage MPL, WM_KEYDOWN, VK_P, 0     PostMessage MPL, WM_KEYUP, VK_P, 0     PostMessage MPL, WM_SYSKEYUP, VK_ALT, 0   End If End Sub 送り先(Test.exe)では、 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)   Dim L As String   L = ""   If Shift = 4 Then L = "Alt + "   Label1.Caption = L & KeyCode End Sub ラベルで「Alt+P」などが来ているかどうか見ています。こちらのウィンドウで「Alt+P」を押すとちゃんと表示されます。 しかし、この2つを組み合わせるとPのみやNのみしか送られてきません。どこかおかしいのでしょうか。 Alt+PなどをPostMessageで送る方法でよい方法があれば、お教え下さい。 よろしくお願いします。

  • ダイヤログボックス内のマウスイベントの処理

    WinXP + BCC でCのプログラムを作成しています。 ダイヤログボックス内のマウスイベントの処理で、ALTキーが押されている場合と押されていない場合で処理を変えたいのです。 alt_downという変数を用意してみましたがダメでした。 case WM_MOUSEMOVE:  if(alt_down == 1) {   ALTキーが押されているときの処理  } else {   ALTキーが押されていないときの処理  }  break; case WM_SYSKEYDOWN:  if(wParam == VK_MENU) alt_down=1;  break; case WM_SYSKEYUP:  if(wParam == VK_MENU) alt_down=0;  break;

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

     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;

  • 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 を捕まえることが出来ますか? 自分でも調べてみましたが、どうも判然と致しません 宜しくご指導のほどお願い申し上げます

  • キィーボードをフックしません、何故ですか???

    パソコンを現在人間が実際に操作中であるか否かを判定しながら進めるアプリを作っています 簡易的にキィーボードを操作していれば操作中と判断します(マウス操作も含めますが話を簡単にするため今はキィーだけとします) グローバルフックでKEY_DOWNをフックする為に以下のDLL(主要部分のみ)を作りました キィーが押されるとMW_KEYDOWN_DLLというメッセージをアプリに送ります EXPORT LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HC_ACTION) { CWPSTRUCT *pcwp = (CWPSTRUCT *)lParam; if(pcwp->message == WM_KEYDOWN) { SendMessage(g_hWnd, WM_KEYDOWN_DLL, pcwp->wParam, pcwp->lParam); ←(1) } } return (CallNextHookEx(g_hHook, nCode, wParam, lParam)); } MW_KEYDOWN_DLLメッセージを受けたアプリは操作中フラグを立てます(主要部分のみ) LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_KEYDOWN_DLL: ここで操作中フラグを立てます ←(2)  このフラグは一定時間後にタイマーが倒します break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return (0L); } 実行してみると(1)に来ません、当然(2)のフラグは立ちません WM_KEYDOWNの代わりにWM_CREATE、WM_CLOSEだときちんとフックします WM_CHAR、MW_KEYUPなどのキィーボード系のメッセージだとフックしません なぜでしょうか??? 多分きわめて初歩的な知識の欠如によるものでしょうが分かりません 宜しくご指導願います

  • TextOut( ) が動かない

    LRESULT CALLBACK WndProc( HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; switch(msg){ case WM_KEYDOWN:  if( wParam == VK_ESCAPE ){   hdc = BeginPaint(hWnd, &ps);   TextOut(hdc,0,0,str,strlen(str));   EndPaint(hWnd, &ps);  }  break; case WM_PAINT:  break; エスケープキーで文字表示をやりたいけど TextOut( ) が動作していないみたいでした。 switch(msg){ case WM_KEYDOWN:  if( wParam == VK_ESCAPE ){   hdc = BeginPaint(hWnd, &ps);   TextOut(hdc,0,0,str,strlen(str));   EndPaint(hWnd, &ps);  }  break; case WM_PAINT:  hdc = BeginPaint(hWnd, &ps);  TextOut(hdc,0,0,str,strlen(str));  EndPaint(hWnd, &ps);  break; とすると、常に文字が表示されたから、やっぱり case WM_KEYDOWN: の中の TextOut( ) が 動作していないんだと思いました。 TextOut( ) は case WM_PAINT: からのつながりが ある場合でないと実行されないんですか? ソースのおかしいところがあったら教えてください。

  • キーコードなどでAlt+○を認識してイベントを発生させるには?

    キーコードなどでAlt+○を認識してイベントを発生させるにはどうしたらよいのでしょうか?ひとつのキーでならできたのですが複数のキーを組み合わせることができませんでした。参考までにうまくいかなかったプログラムの関数部分を記述しておきます。このプログラムだと一回目はうまくいくのですが二回目になるとsキーを押すだけで実行されてしまいます。 document.onkeydown=keyDown; function keyDown() { keynum1=event.keyCode; if(keynum1==18)//この番号がキーに対応してる(Altキー) { document.onkeydown=pressEnter; } } function pressEnter() { keynum2=event.keyCode; if(keynum2==83)//この番号がキーに対応してる(sキー) { document.write("キーコード"); } }

  • win32api 画面のちらつき

    win32api ビットマップを描画したとき、タイマーで少しずつ動かしているのですが、 画面がかなりちらつきます。   調べても、イマイチわからなくてどうすればいいかわかりません。 是非、わかりやすく教えていただきたいです。   タイマーの中身です。 ugokuはタイマーがあるかないかを判断するためにいれました。 なかなかいい方法が見つからなかったので。 playermukiはそのままです。 case WM_TIMER:  ugoku=1; if(playermuki==1){ playerX-=3; InvalidateRect(VisualWnd,NULL,TRUE); }else if(playermuki==2){ playerX+=3; InvalidateRect(VisualWnd,NULL,TRUE); }else if(playermuki==3){ playerY+=3; InvalidateRect(VisualWnd,NULL,TRUE); }else if(playermuki==4){ playerY-=3; InvalidateRect(VisualWnd,NULL,TRUE); } break; また、タイマーをセットするとき case WM_KEYDOWN: if(wParam==VK_RIGHT){ playermuki=1; if(ugoku==0){ SetTimer(VisualWnd,ID_T_UGOKI,50,NULL); } }else if(wParam==VK_LEFT){ playermuki=2; if(ugoku==0){ SetTimer(VisualWnd,ID_T_UGOKI,50,NULL); } }else if(wParam==VK_UP){ playermuki=3; if(ugoku==0){ SetTimer(VisualWnd,ID_T_UGOKI,50,NULL); } }else if(wParam==VK_DOWN){ playermuki=4; if(ugoku==0){ SetTimer(VisualWnd,ID_T_UGOKI,50,NULL); } } return 0; タイマーを切るとき case WM_KEYUP: if(wParam==VK_RIGHT){ KillTimer(VisualWnd,ID_T_UGOKI); ugoku=0; }else if(wParam==VK_LEFT){ KillTimer(VisualWnd,ID_T_UGOKI); ugoku=0; }else if(wParam==VK_UP){ KillTimer(VisualWnd,ID_T_UGOKI); ugoku=0; }else if(wParam==VK_DOWN){ KillTimer(VisualWnd,ID_T_UGOKI); ugoku=0; } return 0;

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

    下のプログラムでは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言語

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

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

専門家に質問してみよう