いつも大変参考にさせててもらってます。
すいませんちょっと質問させてください。
Keybd_eventで特定のアプリに文字列を送ろうと思っています。
https://www.petitmonte.com/bbs/answers?question_id=1252
とりあえずなどを参考にしました。
私がやりたいのはまず送りたい文字列をいったんstring型の変数に書いておいてそれを送ると言うことです。
そこで次のようなコードで文字をおくろうとしました。
---------
var caption : string
keyCodePos : integer
//省略
caption := '255.255.255.255';
for KeyCodePos:=1 to Length(caption) do
begin
keybd_event(Byte(Caption[KeyCodePos]),0,0,0);
keybd_event(Byte(Caption[KeyCodePos]),0,KEYEVENTF_KEYUP,0);
end;
---------
しかしこれだと数字の部分は送れているのですが'.'の部分が送られていないようです。
当然 Keybd_event(VK_DECIMAL,0,0,0); では送れていますが私がやりたいのは送る文字が決まってないのでこの方法は使えません。
いちいち文字を判断して一覧表のようなコード変換表を使ってKeybd_eventしなければならないんでしょうか?→こんな表みたいな・・・https://www.petitmonte.com/bbs/answers?question_id=8
数字やアルファベットのような単純な?文字以外を送るときはどのようにしたらよろしいのでしょうか。ご存じの型いらっしゃいましたらご教授お願いします。
小数点は VK_DECIMAL ですね。これは Byte('.') と一致してません。
> いちいち文字を判断して一覧表のようなコード変換表を使ってKeybd_eventしなければならないんでしょうか?
そうです。
受け取るほうはプログラムできないのですか?
sendkey delphi で google するといろいろ参考になると思います
>Keybd_eventで特定のアプリに文字列を送ろうと思っています。
他のアプリに文字列を送るという場合,どんなコントロールに送る(セット
する?)か,などによりいろいろ方法が考えられます.また,文字列を受取
るアプリが,Delphiで自分が開発した,他の方が開発してコードが分かっ
ているか,それとも,全く別の市販のアプリなのか,そのアプリについて
どの程度の情報があるかによっても違ってきます.
更に,使用できる関数類もDelphiのバージョンやWindowsのバージョンに
よっても異なる場合(使えない,使える等)があります.したがって,質問
する時は,開発環境を記述することがマナーや常識になっています.
例えば
SendDlgItemMessage(Wnd,Id2,WM_SETTEXT,0,LongInt(PChar(S2)));
は,ハンドルがWndのID値がId2のコントロールに文字列S2をセット
する例です.また(自分自身が起動した)Memoに文字列を送る例が以下の
ページにあります.
http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N002.html
こんなのがヒントになるでしょうか.
りりか様、Mr.XRAY様 早速の書き込みありがとうございます。
>受け取るほうはプログラムできないのですか?
文字を送るプログラムは私が作ったやつではないのでちょっと無理なんです。
>sendkey delphi で google するといろいろ参考になると思います
大変参考になりました。sendkeyはちょっとみたことがあったんですがてっきり
誰かが作ったコンポーネントのことだと思って手を出していませんでした。
しかし詳しくみてみるとdelphiのCDの中にsndkey32.pasなんていうやつがあったんですね。確かにこれを使いましたら'.'も入力できるようになりました。
-------------
SetIP := 255.255.255.255
SendKeys(PChar(SetIp),true);
SendKeys(chr(VK_RETURN),true);
-------------
とりあえず目的のことはsendkeysを使うことで達成されましたのでこれで解決済みにさせていただきます。
Mr.XRAY様
>開発環境を記述することがマナーや常識になっています.
そうですね。今回のような質問ではそれほど関係ないかと思って省略してしまいました。以後気をつけたいと思います。
>SendDlgItemMessage(Wnd,Id2,WM_SETTEXT,0,LongInt(PChar(S2)));
私も送りたいプログラムが前面にきてないと使えないkeybd_eventなどを使わずに
ハンドル指定でキーを送るのが理想と考えていたんですが、残念ながらキーを送りたいプログラムは、クラスがEditでキャプションが不定のEditBoxが3つあるプログラムだったのでその3つを区別する手段がなくて使いませんでした。
ちなみにクラス名などはhttp://www.h3.dion.ne.jp/~hanagex/dev/contents/soft/devtool/fsdev.html
でみました。
>SendDlgItemMessage
すみません、この関数については知りませんでした。WndはハンドルとしてId2が何を示すのが勉強不足でまだわかってません。Mr.XRAYさんの紹介のページなどを参考にしてちょっといろいろ試してみたいと思います。
今回はいろいろ参考にさせていただきました。どうもありがとうございました。
ところでEditBoxが3つあるんですが位置はわかっているのでその位置で一番上のEditBoxのハンドルを得るなんてことはできるんでしょうか?
すいません、押し忘れました。
> クラスがEditでキャプションが不定のEditBoxが3つあるプログラムだったの
> でその3つを区別する手段がなくて使いませんでした。
ご存じのように、キー入力をシミュレートするにしても、フォーカスが当たっている
コントロールにしか送れません。区別がつかないコントロールにどうやってフォーカスを
あてているのか、ひょっとしてマウスでクリックしているとか?
Edit クラスならハンドルかコントロールIDを知ることが出来れば、Mr.XRAY さん
のおっしゃるようにフォカスがなくても WM_SETTEXT で簡単に送れます。ウィンドウ
ハンドルは起動毎に異なりますが、コントロールIDはいつも同じですから、
SendDlgItemMessage はとても役に立ちます。ダイアログ自体のウィンドウハンドル
はその都度取得しなければなりませんが。
>フォーカスをあてているのか
すみませんちょっと説明不足でした。送信先のプログラムが開いたときに私が入れたいEditBoxにフォーカスが当たっている状態になっているのですぐにキーを送れると言うことでした。
>Edit クラスならハンドルかコントロールIDを知ることが出来れば
>コントロールIDはいつも同じですから
コントロールIDについては知りませんでした。てっきりフォーカスの指定などにもちいることができるのはクラス名とキャプションだけだと思ってました。
なるほどこれを使えばEditBoXが特定できそうです。
resourcehacker
http://www.users.on.net/johnson/resourcehacker/
でコントロールIDを取得して
SendDlgItemMessage(WinHnd,1000,WM_SETTEXT,0,LongInt(PChar(SetIp)));
で送ったらできたようです。
>SendDlgItemMessage はとても役に立ちます
確かに非常に役に立ちますね・・・・ すばらしいです
有意義なアドバイスありがとうございました
>コントロールIDはいつも同じですから
実はいつも同じでないこともあります.
新規プロジェクトにTEditを3つ程配置して実行し,IDを調べてみて下さい.
次に,そのプロジェクトのFormのOnCreateイベントを以下のコードにして
実行してみて下さい.このコードは,Edit1,Edit2,Edit3にID値を設定す
るものです.
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Edit1.Handle,GWL_ID,100);
SetWindowLong(Edit2.Handle,GWL_ID,200);
SetWindowLong(Edit3.Handle,GWL_ID,300);
end;
動作確認 WindowsXP(SP2) + Delphi5(UP1)
Delphiアプリの場合はつかえませんね。
ツイート | ![]() |