TeraTermに矢印キーを押した状態にする方法


ポーン  2007-01-23 07:04:59  No: 134935

自作のアプリからTeraTermに矢印キーを送信したいと考えています。
下記のようにPostMessageを使用して↑キーを押下した状態をテラタームのウィンドウハンドルに送信していますが、うまくいきません。
どのようにすればよろしいか、よろしくお願い致します。

>PostMessage(hWnd, WM_KEYDOWN, VK_UP, 1)
>PostMessage(hWnd, WM_KEYUP, VK_UP, 1)

※Winspectorで見ると以下のようにメッセージは受け渡せています。
  結果はTeraTermの画面に8と出力されます。
    WM_KEYDOWN
        Virtual Key: VK_UP
        Message Posted
        Time: 12:59:38.0303

    WM_KEYUP
        Virtual Key: VK_UP
        Message Posted
        Time: 12:59:38.0313

    WM_KEYUP
        Virtual Key: VK_UP
        Message Posted
        Time: 12:59:38.0323

    WM_USER + 4 (0x00000404)
        wParam: 0x000000ec
        lParam: 0x00000001
        Message Posted
        Time: 12:59:38.0423

※TeraTermのKeycodeはデフォルト(DOS/V)設定です。

※文字列等は以下の通りにしましたら正しく受け渡しができました。
PostMessage(hWnd, WM_CHAR, Asc(e.KeyChar), 1)


YAS  2007-01-23 09:18:03  No: 134936

Win32APIのSendInput関数などでキー入力をエミュレートしてみたらいかがでしょうか。

PostMessage関数については申し訳ありませんが,わかりません。


YAS  2007-01-23 09:26:29  No: 134937

上矢印キーはEXTENDEDKEYなので,それが影響しているのでは?
たぶんですが,ExtendedKeyフラグを1にする必要があると思います。


ポーン  2007-01-23 16:34:34  No: 134938

YASさんどうもありがとうございます。

■SendInput
SendInputはTeraTermをアクティブにしなくても送信できますか?
複数ウィンドウにメッセージを送信したいので、
PostMessage関数を選びました。

■EXTENDEDKEY
EXTENDEDKEYとはどういう値でしょうか?
lParamにorさせれば良いのでしょうか?

よろしくお願いします。


YAS  2007-01-24 05:51:58  No: 134939

lParamの24bitを1にします。
その他の設定も確認した方がよいと思います。
以下のページが参考になると思います。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputmessages/wm_keydown.asp

http://www.winapi-database.com/Message/WM/WM_KEYDOWN.html


ポーン  2007-01-24 09:20:03  No: 134940

■試し
下記の様に試しにlParamの24ビットをONさせてみましたが、
結果は8と出力されるだけでした。

>PostMessage(hWnd, WM_KEYDOWN, (VK_UP or &H1000000), 1)
>PostMessage(hWnd, WM_KEYUP, (VK_UP or &H1000000), 1)

■結果
Window messages created by Winspector
    WM_KEYDOWN
        Virtual Key: Unknown key (16777254)
        Message Posted
        Time: 15:17:30.0965

    WM_KEYUP
        Virtual Key: Unknown key (16777254)
        Message Posted
        Time: 15:17:30.0975

    WM_KEYUP
        Virtual Key: Unknown key (16777254)
        Message Posted
        Time: 15:17:30.0975

    WM_USER + 4 (0x00000404)
        wParam: 0x000000f0
        lParam: 0x00000001
        Message Posted
        Time: 15:17:31.0075

    SkypeControlAPIDiscover (Registered messages)
        wParam: 0x0001043a
        lParam: 0x00000000
        Message Posted
        Time: 15:17:32.0648

■ムムム
ん〜、この方法ではいけないのでしょうか(?_?;)


ポーン  2007-01-24 09:39:13  No: 134941

■すいません。
lParamなので、一番最後の変数でした(汗)
>PostMessage(hWnd, WM_KEYDOWN, (VK_UP), (&H1000000 or 1)
>PostMessage(hWnd, WM_KEYUP, (VK_UP), (&H1000000 or 1)
としましたが、結果は“&”が出力されるだけでした。

■結果
Window messages created by Winspector
  SkypeControlAPIDiscover (Registered messages)
    wParam: 0x0001043a
    lParam: 0x00000000
    Message Posted
    Time: 15:33:44.0144

  WM_KEYDOWN
    Virtual Key: VK_UP
    Message Posted
    Time: 15:33:47.0589

  WM_KEYUP
    Virtual Key: VK_UP
    Message Posted
    Time: 15:33:47.0599

  WM_KEYUP
    Virtual Key: VK_UP
    Message Posted
    Time: 15:33:47.0599

  SkypeControlAPIDiscover (Registered messages)
    wParam: 0x0001043a
    lParam: 0x00000000
    Message Posted
    Time: 15:33:49.0152

  SkypeControlAPIDiscover (Registered messages)
    wParam: 0x0001043a
    lParam: 0x00000000
    Message Posted
    Time: 15:33:54.0159

■ウィンドウハンドルにはきちんとメッセージが送信出来ているように見えますが、なぜ出来ないんでしょう?(?_?;)


Geo=TK3  2007-01-24 15:12:09  No: 134942

>■ウィンドウハンドルにはきちんとメッセージが送信出来ているように見えますが、なぜ出来ないんでしょう?(?_?;)

外からメッセージ送るだけでアプリケーションを期待通りに操作出来るとは限らないから。
# アプリケーションのメッセージ処理方法に依存しますからね。

TeraTerm のソースをざっと追ってみたのですが、WM_KEYDOWN の場合は仮想キーコードではなく、スキャンコードから押されたキーを判断しているようでした。
この為 PostMessage で WM_KEYDOWN を送る場合、wParam に VK_UP を渡すだけではなく、lParam にも↑キーを押した時に Windows がセットする値と同じ値を渡してやる必要があるかと。
# lParam を妥当な値にすれば制御できるかまでは未検証ですが。


ポーン  2007-02-01 07:46:11  No: 134943

ありがとうございました。
試行錯誤していますが、まだ実現出来ていません。。。

他でも聞いてみようと思います。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加