- ベストアンサー
Alt+P,Alt+NをPostmessageで送る方法について
- Postmessageを使用してAlt+P、Alt+Nを送る方法について質問しています。
- 具体的なコードとして、Form_KeyDownイベント内でPostmessageを使用してAlt+P、Alt+Nを送信しているが、うまく送信されない状況が発生している。
- 送り先のTest.exeではAlt+Pなどがちゃんと表示されているが、組み合わせるとPやNしか送られてこない状況になっている。解決方法を教えて欲しいという要求。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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ですので。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>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からは見えないので気にしないでいいですよ。
お礼
お手数をおかけします。 実際に使うPCで実行してみたら、Altキーは押さなくても良いことが分かりました。 PostMessageでWM_KEYDOWNを送ることによりPやNキーを押すことが出来ました。 今回ご回答いただいた内容は、今後の製作に役立てたいと思います。 ありがとうございました。 ちなみに、 >最前面に出ますか? は、コードが記載されているフォームをSetWindowPosで最前面にしているので、最前面に来ません。フォーカスも移動しません。 これをやってからkeybd_eventを実行している例文があったので、それを踏襲したので、etForegroundWindowを使っている理由は分かりません。
補足
回答ありがとうございます。 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クリックのみが送信されるので、望み通り行くのかも知れません。 今は実機がないので検証不可能です。 上記のコードに何か不都合がありそうであれば、またご教授下さい。