自作のアプリから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)
Win32APIのSendInput関数などでキー入力をエミュレートしてみたらいかがでしょうか。
PostMessage関数については申し訳ありませんが,わかりません。
上矢印キーはEXTENDEDKEYなので,それが影響しているのでは?
たぶんですが,ExtendedKeyフラグを1にする必要があると思います。
YASさんどうもありがとうございます。
■SendInput
SendInputはTeraTermをアクティブにしなくても送信できますか?
複数ウィンドウにメッセージを送信したいので、
PostMessage関数を選びました。
■EXTENDEDKEY
EXTENDEDKEYとはどういう値でしょうか?
lParamにorさせれば良いのでしょうか?
よろしくお願いします。
lParamの24bitを1にします。
その他の設定も確認した方がよいと思います。
以下のページが参考になると思います。
http://www.winapi-database.com/Message/WM/WM_KEYDOWN.html
■試し
下記の様に試しに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
■ムムム
ん〜、この方法ではいけないのでしょうか(?_?;)
■すいません。
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
■ウィンドウハンドルにはきちんとメッセージが送信出来ているように見えますが、なぜ出来ないんでしょう?(?_?;)
>■ウィンドウハンドルにはきちんとメッセージが送信出来ているように見えますが、なぜ出来ないんでしょう?(?_?;)
外からメッセージ送るだけでアプリケーションを期待通りに操作出来るとは限らないから。
# アプリケーションのメッセージ処理方法に依存しますからね。
TeraTerm のソースをざっと追ってみたのですが、WM_KEYDOWN の場合は仮想キーコードではなく、スキャンコードから押されたキーを判断しているようでした。
この為 PostMessage で WM_KEYDOWN を送る場合、wParam に VK_UP を渡すだけではなく、lParam にも↑キーを押した時に Windows がセットする値と同じ値を渡してやる必要があるかと。
# lParam を妥当な値にすれば制御できるかまでは未検証ですが。
ありがとうございました。
試行錯誤していますが、まだ実現出来ていません。。。
他でも聞いてみようと思います。
ツイート | ![]() |