プロが教えるわが家の防犯対策術!

あるアプリがあり、そのハンドルを取得してからメッセージを送るプログラムを作っています。
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で送る方法でよい方法があれば、お教え下さい。
よろしくお願いします。

A 回答 (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ですので。

この回答への補足

回答ありがとうございます。

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クリックのみが送信されるので、望み通り行くのかも知れません。
今は実機がないので検証不可能です。

上記のコードに何か不都合がありそうであれば、またご教授下さい。

補足日時:2005/03/07 01:08
    • good
    • 0

>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?ur …

>これで何とか行きそうだったのですが、PageUpを押すときに「Fn」キーも押さなくてはならず、これによりFn+PageUpが送信されているような気がします。

Fnって、ノートパソコンとかでキーの数を減らすためにある特殊なキーのことですよね?これはOSからは見えないので気にしないでいいですよ。
    • good
    • 0
この回答へのお礼

お手数をおかけします。
実際に使うPCで実行してみたら、Altキーは押さなくても良いことが分かりました。
PostMessageでWM_KEYDOWNを送ることによりPやNキーを押すことが出来ました。

今回ご回答いただいた内容は、今後の製作に役立てたいと思います。
ありがとうございました。

ちなみに、
>最前面に出ますか?
は、コードが記載されているフォームをSetWindowPosで最前面にしているので、最前面に来ません。フォーカスも移動しません。
これをやってからkeybd_eventを実行している例文があったので、それを踏襲したので、etForegroundWindowを使っている理由は分かりません。

お礼日時:2005/03/07 23:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A