他のウインドウのEdit Boxなどに入力するには?

解決


ushi  2002-06-16 08:45:34  No: 1006

DelphiでVB,Cなど他のプログラムで書かれたウインドウのEDIT BOXの内容を読み書きするにはどうすれば良いのでょうか。


にしの  2002-06-16 13:09:27  No: 1007

そのままの意味で受け取ってよいでしょうか。
つまり、「他のアプリケーションのエディットボックスにかかれた内容を、自アプリケーションで読み書きするにはどうすればよいか」ですよね。
まず、どのエディットボックスを読み書きするかを特定します。
特定方法はいろいろありますが、次のような手順になります。
1.他のアプリケーションのウィンドウを検索(タイトルバー、クラス名などで)
2.他のアプリケーションウィンドウから、目的のエディットボックスを検索。
3(読み込みの場合)目的のエディットボックスに対して、WM_GETTEXTメッセージをポスト。
4(書き込みの場合)目的のエディットボックスに対して、WM_SETTEXTメッセージをポスト。

1、2で使うAPIは、FindWindow,FindWindowEx,EnumWindowsなどです。
3、4で使うAPIは、PostMessageなどです。


ushi  2002-06-16 20:43:56  No: 1008

にしの様、回答有難う御座います。当方プログラム初心者の部類ですので、API(Delphiもですが)の使い方が今ひとつ解かりません。


たかみちえ  URL  2002-06-17 05:16:19  No: 1009

ふむふむそうですねぇ、
  まず、Windowsというものは、たとえばメモ帳などの画面そのものを、
メモ帳の親ウィンドウとして、
そして、メモ帳の実際にメモをかく部分を、メモ帳の子ウィンドウとして扱います。
こういう仕組みが全てのソフトにも通用して、
たとえばDelphiで作ったフォームなら、親ウィンドウ(フォーム)をつくって、
その中に子ウィンドウ(コンポーネント)をいっぱいおいていく…という感じになりますね、
(厳密に言うとどこか違うのかもしれませんけど、
  とりあえずわたしはそれで理解してて問題ありません^^;)

  …で、親・子ウィンドウはそれぞれ、Windowsからの識別番号として、
ハンドルをもらいます。
このハンドルを知ることができれば、
たとえどんなソフトのウィンドウでも、いじったりすることができるんです。

  さて、1.2は、で、相手のウィンドウのハンドルを知るのが、
FindWindowとかのAPIです。
FindWindowは、親ウィンドウのみ、FindWindowExは、指定した親ウィンドウ(ハンドル)が持っている子ウィンドウの中から、
好きな(ともいかない場合もありますけど)ウィンドウのハンドルを知ることができるAPIです。

  それから、クラス名というのは、ウィンドウにそれぞれつけられた名前です。
Delphiアプリケーションでは、コンポーネントとおなじ名前になります。(フォームのはNameプロパティのと同じ)
これと、キャプションをうまく使えば、だいたいのウィンドウは探せますよね。
(VBの親ウィンドウというのは、みんなThunderRT6Formとかになっているので、見分けがつきませんけど)
まあ、相手のウィンドウクラスとかは、ここにあるソフトとかを使えばいいでしょう。
http://www.h3.dion.ne.jp/~hanagex/
  適当なウィンドウを調べたりして遊んでみれば、ウィンドウとかハンドルとかの概念が分かってくるかと。

  さて、3.4ですけど、PostMessage(よく似たAPIでSendMessageというのもあります、この場合はこっちがいいかもしれません)は、
ウィンドウハンドルに、ウィンドウメッセージを送るAPIです。
ウィンドウメッセージとは、Windowsがそれぞれのウィンドウを管理するために使っているもので、
これを自分が送ることで、Windowsがやってることができます。
(うえとおなじく厳密に言うとちょっと違うのかもしれませんけど、
  とりあえずわたしはそれで理解してて問題ありません^^;)

  それで、WM_GETTEXTとは、指定したハンドルのウィンドウのキャプション(テキストボックスだったらその中の文章…など)を、
知るためのメッセージです。
これを指定したウィンドウに送れば、相手ウィンドウのキャプションが分かりますね。

  それと、WM_SETTEXTとは、指定したウィンドウのキャプションを、
好きなものに指定するメッセージです。
目的からすると、使うのはこっちですね。

  さて、長文ですけど、これで原理は分かったでしょうか?説明下手なのでわからないかもしれませんけど…。

  くわしい使いかたは…。定型文になってしまいますねぇ、
ここにそれを書くのも長くなるだけなので、
これらのサイトなどで調べてみてください。
[ でべろっぱのすすめ ]と[ じあぴ ]
http://www.ab.wakwak.com/~greenspace/dev-api/
(DelphiでのAPIの使いかたとか分かると思います)

ちょくとのページ
http://yokohama.cool.ne.jp/chokuto/
(HSPという言語のページですが、ウィンドウメッセージが詳しく書いてあります)

  それでも分からない場合は、検索エンジンなどで、API名を入れて探してみるのも手かと思います。
その場合、SendMessageでは言葉としてありふれているのか関係ないページもたまに引っかかりますので、
"Delphi SendMessage"とか  "API SendMessage"とかするといいでしょう。
(逆に使われにくいAPIで、一般的な言葉でないものの場合、
  API名のみで検索しないと何も引っかからないことがしばしばあります^^;)

  ちなみに、EditBoxのテキストがとても大きい(1Mとか)場合、
keybd_eventというAPIで、Ctrl+Cを押させ、
クリップボードにコピーしてもらうとかの方が安全だと思います。


ushi  2002-06-17 06:54:50  No: 1010

たかみちえ様、にしの様  今回の回答、情報など有難う御座いました。解決したわけではありませんが、教えてもらいました。情報をもとに、すこし自分でやってみたいと思います。また解からないところが出てくるとは思いますが(かならず!)。そのとき又、皆様にお聞きできればと思います。今回の回答、情報ありがとうございました。


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








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