• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Alt+P,Alt+NをPostmessageで送るには)

Alt+P,Alt+NをPostmessageで送る方法について

このQ&Aのポイント
  • Postmessageを使用してAlt+P、Alt+Nを送る方法について質問しています。
  • 具体的なコードとして、Form_KeyDownイベント内でPostmessageを使用してAlt+P、Alt+Nを送信しているが、うまく送信されない状況が発生している。
  • 送り先のTest.exeではAlt+Pなどがちゃんと表示されているが、組み合わせるとPやNしか送られてこない状況になっている。解決方法を教えて欲しいという要求。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

ALTキーとの組み合わせでしたら、WM_SYSCHARのほうがいいのでは? たぶん、送り先もVB製でしたら内部でTranslateMessageような感じですし。 あと、 >PostMessage MPL, WM_SYSKEYDOWN, VK_ALT, 0 MPLってなんですか? >hTest = FindWindow(vbNullString, "Test") で取得したウィンドウにPostMessageするんじゃないんですか? 次に、 >Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) KeyDownイベントに処理が書かれてますが、このイベント自体は呼ばれてますか?キー操作を受け付けるコントロールが張り付いてるのにKeyPreviewプロパティがFalseなんてことは無いですか? #ちなみに、普通はVK_ALTではなくVK_MENUですので。

cip
質問者

補足

回答ありがとうございます。 MPLとは、修正し忘れです。実際のコード内ではMPL.exeを探して処理をしています。 ここに記載する際、Test.exeということにしておくことにしただけです。 修正案として、keybd_eventを使う方法もやってみました。   If KeyCode = 33 Then     Label1.Caption = "PageUp"     SetForegroundWindow (MPL)     keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), 0, 0     keybd_event vbKeyP, MapVirtualKey(VK_P, 0), 0, 0     keybd_event vbKeyP, MapVirtualKey(VK_P, 0), KEYEVENTF_KEYUP, 0     keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), KEYEVENTF_KEYUP, 0     FocusSet (Me.hwnd)     SetForegroundWindow (Me.hwnd)   ElseIf KeyCode = 34 Then     Label1.Caption = "PageDown"     SetForegroundWindow (MPL)     keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), 0, 0     keybd_event vbKeyN, MapVirtualKey(VK_N, 0), 0, 0     keybd_event vbKeyN, MapVirtualKey(VK_N, 0), KEYEVENTF_KEYUP, 0     keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), KEYEVENTF_KEYUP, 0     FocusSet (Me.hwnd)     SetForegroundWindow (Me.hwnd)   End If FocusSetとはSetFocus APIのエイリアスです。 これで何とか行きそうだったのですが、PageUpを押すときに「Fn」キーも押さなくてはならず、これによりFn+PageUpが送信されているような気がします。 送信先で   Dim Mes As String   Mes = ""   If Shift = 4 Then Mes = "Alt + "      If KeyCode = LastCode Then     Counter = Counter + 1   Else     Counter = 1     LastCode = 0   End If   Label1.Caption = Mes & KeyCode & vbCrLf & Counter & "回目"   LastCode = KeyCode のようにして送信された回数をカウントしてみたのですが、Alt+18が何度も表示され(Alt+Altです)、また、   If KeyCode = 18 Then Exit Sub を追加してもPageUpが押した回数分カウントされませんでした。やはりFnキーが鬼門なのでしょうか。 実際の使用では、プレゼン用のレーザーポインターに付いたボタンによりPageUp,PageDownクリックのみが送信されるので、望み通り行くのかも知れません。 今は実機がないので検証不可能です。 上記のコードに何か不都合がありそうであれば、またご教授下さい。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>SetForegroundWindow (MPL) これで対象のウィンドウ、最前面に出ますか? OSによってはタスクバーのところが点滅するだけのはずですけど。 (というか古いOSしか最前面に出ませんが) >keybd_event VK_ALT, MapVirtualKey(VK_ALT, 0), 0, 0 第2引数になにやら入れてますが、"not use"ですので0でかまわないはずです。これが悪影響を及ぼしてませんかね? http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/keybd_event.asp >これで何とか行きそうだったのですが、PageUpを押すときに「Fn」キーも押さなくてはならず、これによりFn+PageUpが送信されているような気がします。 Fnって、ノートパソコンとかでキーの数を減らすためにある特殊なキーのことですよね?これはOSからは見えないので気にしないでいいですよ。

cip
質問者

お礼

お手数をおかけします。 実際に使うPCで実行してみたら、Altキーは押さなくても良いことが分かりました。 PostMessageでWM_KEYDOWNを送ることによりPやNキーを押すことが出来ました。 今回ご回答いただいた内容は、今後の製作に役立てたいと思います。 ありがとうございました。 ちなみに、 >最前面に出ますか? は、コードが記載されているフォームをSetWindowPosで最前面にしているので、最前面に来ません。フォーカスも移動しません。 これをやってからkeybd_eventを実行している例文があったので、それを踏襲したので、etForegroundWindowを使っている理由は分かりません。

関連するQ&A

専門家に質問してみよう