SendMessageを使ってEnterを送るには?

解決


Zodan  2005-08-21 21:59:06  No: 91627

タイトル通りの内容なのです。
SendMessageを使いEnter(改行ではない)を送信しようと試みているのですがうまく動作しません。
以下コードです。

'モジュール
Public Declare Function SendMessage Lib "user32"  Alias "SendMessageA" ( _
          ByVal hWnd As Long, _
          ByVal wMsg As Long, _
          ByVal wParam As Long, _
          lParam As Any) As Long

Public Const WM_SETTEXT As Integer = &HC
Public Const WM_KEYDOWN As Integer = &H100
Public Const VK_RETURN As Integer = &HD

'コマンドボタン押下時の処理
Dim Str as String
Dim Hnd as Long

Str = "TestMessage"

Call SendMessage(Hnd, WM_SETTEXT, 0, ByVal Cstr(Str))
Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)

これだとエラーは出ませんが二度目のSendMessageが上書されるだけのようです。
難しいですね・・・


030  2005-08-22 02:23:08  No: 91628

>うまく動作しません
何がどううまく動作しないのでしょう?
メッセージを送ろうとする対象となっているものは何ですか?

>SendMessageが上書されるだけのようです
上書きされるとはどういうことですか?
Spy++等で調べた結果、相手側に最初のメッセージが伝わっていないということですか?

うまく動作するという定義がよく分かりませんが、その対象となるものを
Spy++等で監視して、うまく動作するときのメッセージの流れを見てみては
いかがですか?


Zodan  2005-08-23 01:29:55  No: 91629

>>うまく動作しません
>何がどううまく動作しないのでしょう?
>メッセージを送ろうとする対象となっているものは何ですか?

>エラーは出ませんが二度目のSendMessageが上書されるだけのようです

>>SendMessageが上書されるだけのようです
>上書きされるとはどういうことですか?
>Spy++等で調べた結果、相手側に最初のメッセージが伝わっていないということですか?
二度目のSendMessageの内容が対象のハンドルに飛ぶだけっていみです。
Spy++なるものは所持しておりません。


通ってみた  2005-08-23 01:39:02  No: 91630

>>二度目のSendMessageの内容が対象のハンドルに飛ぶだけっていみです。

飛んでるのなら正常なのでは?


Zodan  2005-08-23 01:53:04  No: 91631

まぁ飛んでるのに上書されるってのはおかしい罠。
正常じゃないと。
コード晒してコード自体は指摘されないって事は問題はないって取るべきか。
いずれにしても公爵しか垂れない集まりに聞くのは時間の無駄だったか?
てか知ってるやつがいないだけかw


ガッ  2005-08-23 02:04:02  No: 91632

公爵×、講釈○
以下スルー

で、元の投稿者さんの
> 二度目のSendMessageの内容が対象のハンドルに飛ぶだけっていみです。
は普通の現象だと思うが…SendMessageでメッセージが飛ぶだけじゃだめなの?

> Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)
…もしかして最後の引数、ByVal 0 …?


ねろ  2005-08-23 02:27:28  No: 91633

Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)
で何を期待してるか知らないけど、Text_KeyDownイベントの
引数KeyCodeに13が送られてきたら、OKとしたものでは。

r = SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)
こう書けば成功したかしないかは、判りそうなものだが。


Zodan  2005-08-23 02:44:34  No: 91634

>Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)
>で何を期待してるか知らないけど
対象のハンドルの部分でエンターキーを押して欲しいんです。
対象のハンドルをアクティブにしそこでkeybd_eventでエンターで代用できるのですが、
実行中にマウスを動かしたり別のウインドウを選択してしまうと正しく動作しません。

>> Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)
>…もしかして最後の引数、ByVal 0 …?
Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)
Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, Byval 0)
Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)
Call SendMessage(Hnd, WM_SETTEXT, 0, VK_RETURN)
いろいろ試しましたがどれも思うように動作しませんでした。


Zodan  2005-08-23 02:49:34  No: 91635

ハンドルに対してキーをエミュレートするAPIなんてないんですかね。


ガッ  2005-08-23 02:56:31  No: 91636

コンソールウィンドウにたいしてはしている人がいるらしい…
http://www.ragestorm.net/snippet?id=45

WM_KEYDOWNを送るときのlParamの値の指定の仕方は正しい?


Zodan  2005-08-23 03:14:02  No: 91637

Public Const WM_KEYDOWN As Integer = &H100
Public Const VK_RETURN As Integer = &HD

↑これ間違ってますかね?

lParamの値の指定は
Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)
Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, Byval 0)
Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)
こんな感じでいろいろ試しましたけどWM_KEYDOWN時、かならずしも0じゃないとかですか?


ねろ  2005-08-23 06:39:27  No: 91638

>Public Const WM_KEYDOWN As Integer = &H100
>Public Const VK_RETURN As Integer = &HD
>↑これ間違ってますかね?
自分のフォームにTextBoxを置きText_KeyDownにブレークポイントを置き
SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)をやってみればすぐ判ることでは。

>対象のハンドルの部分でエンターキーを押して欲しいんです。
無理、大体EnterKeyを押すのはWM_KEYDOWNだけじゃないでしょ、
KeyUpもあるし、押し続け、2重押しなどもあるし。


通ってみた  2005-08-23 07:30:49  No: 91639

送る側はキー飛ばしてるだけでしょ?それが飛んでるんだから正常じゃないのか
受ける側の問題なんじゃないの?


030  2005-08-23 10:07:49  No: 91640

対象のハンドルとは?
対象って具体的にはコマンドボタン?
その対象がどうメッセージを処理しているかも分からないで
闇雲にメッセージを送るだけ無駄かと。

構文間違いとか値の間違いでうまくいっていないのではなく
その対象の動作の解析不足がうまくいっていない原因なのでしょう。

提示されたコードが間違っているかどうかは、その対象によるでしょう。
メッセージを送るだけなら、それで十分間に合ってますよ。
ただ、対象がうまくどうさするかどうかまでは、提示されたコード
だけでは情報不足です。


Zodan  2005-08-23 10:15:18  No: 91641

>自分のフォームにTextBoxを置きText_KeyDownにブレークポイントを置き
>SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)をやってみればすぐ判ることでは。
やってみてうまくいかないから質問したわけだが。

>通ってみた
まぁまぁ。
なんも知らないやつはだまっとけよw


Zodan  2005-08-23 10:21:35  No: 91642

>対象のハンドルとは?
>対象って具体的にはコマンドボタン?
>その対象がどうメッセージを処理しているかも分からないで
>闇雲にメッセージを送るだけ無駄かと。
一種類でないんでなんともいえませんが、
今回テストしている対象はメモ帳です。

>メッセージを送るだけなら、それで十分間に合ってますよ。
まず一度目のSendMessageで文字を送り、
二度目のSendMessageでEnterを送りたいんで、
メモ帳には「一度目のSendMessage(改行)」となるのが理想です。
改行をVbCrLfで代用などではなくエンターでエミュレートしたいんですが。


Zodan  2005-08-23 10:25:06  No: 91643

>>自分のフォームにTextBoxを置きText_KeyDownにブレークポイントを置き
>>SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)をやってみればすぐ判ることでは。
>やってみてうまくいかないから質問したわけだが。
うまくいかないのはブレークポイントでとまらないという意味ではなく、
メモ帳で実験した場合にはうまくいかないって意味です。
ブレークポイントでは止まります。(ちなみにKeyAsciiは13)


ガッ  2005-08-23 10:26:31  No: 91644

私より詳しい方がおられるようなので、すこしまとめage

やりたいこと
・SendMessageを使いEnter(改行ではない)を送信

やったこと
・Call SendMessage(Hnd, WM_KEYDOWN, VK_RETURN, 0)を実行
  →うまくいかない、
    SendMessageの内容が対象のハンドルに飛ぶだけ
    (つまり正常にメッセージが送信されてる)
・WM_KEYDOWNメッセージを送るときのlParamをByVal 0とかにしてみた。
  →思うように行かない

できないこと
・うまくいかないこと。

引数の問題でもなさそうなので、「送信する側」には問題がないよーです。
ですので、ココから先は貴方の問題ではなくて受け取り手の問題だと思う。
というのが、近頃のスレの流れです。

※さて、再現するの面倒だしなぁ…一度レス全部を読み返すと重大なヒントが…?


Geo=TK3  2005-08-23 14:43:03  No: 91645

# 詳しくないけどしゃしゃり出ます。

ターゲットがメモ帳って想定外ですた...orz

えーと、それなら SendMessage ではなく PostMessage 使ってください。
メモ帳側のメッセージループ回して WM_KEYDOWN → WM_CHAR の変換
させないと期待通りの動作をしない筈だから、恐らく SendMessage で
は実現できません。


うぇうぇ  2005-08-23 16:30:42  No: 91646

質問者の態度には見えんけどねぇ。
仕事だか宿題だか知らんけどせいぜい頑張ってください。

解決しても放置がオチだなこりゃ。


ねろ  2005-08-23 17:46:02  No: 91647

自分の考えてる仕様とWindowsの仕様が違うだけでは。
Windowsにはちゃんとアプリケーションにキーストロークを送信する
コマンドが有るのだから、私なら
    Dim AppId
    AppId = Shell("notepad.exe", vbNormalFocus)   'メモ帳起動
    AppActivate (AppId)
    SendKeys "SendMessageを使うより、SendKeyで!"  '書き込む
    SendKeys "{HOME}"
    For n = 1 To 17
        SendKeys "{RIGHT}"
    Next
    SendKeys "{ENTER}"
    SendKeys "{TAB}" & "{TAB}"
この様にやるが。


ねろ  2005-08-23 17:55:37  No: 91648

>Windowsにはちゃんとアプリケーションにキーストロークを送信する
>コマンドが有るのだから
この表現、正しくない。

VBで使うSendKeysはVBのコマンドです。
.NET FrameworkだとSendKeys クラス、
Windows Script HostだとSendKeys メソッドです。orz


Zodan  2005-08-23 20:12:14  No: 91649

>Geo=TK3様
仰る通りの内容で希望通りの動作が可能でした。
ありがとうございました。

>ねろ様
色々ご指導ありがとうございました。
書いてはいませんでしたがkeybd_eventを使う前に、
SendKeysを使っていましたが動作はkeybd_eventと
変わらなかったためとりあえずkeybd_eventの件を
書きました。

>ガッ
長々とお付き合い頂きありがとうございました。

>質問者の態度には見えんけどねぇ。
>仕事だか宿題だか知らんけどせいぜい頑張ってください。
>
>解決しても放置がオチだなこりゃ。
通ってみたさん粘着おつかれ様でした。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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