直前までアクティブだったwindowからコピーするには

解決


  2002-10-15 23:48:29  No: 76216

直前までアクティブだったwindow(メモ帳など)のテキストをクリップボード
経由でVBのテキストボックスにコピーしたいのですが方法は有りますか?
メモ帳でCtrl+Cを押せばよい事なのですが、VBからの操作で1ボタンで
コピー貼り付けをしたいです。アドバイスいただけたらうれしいです
よろしくお願いします。


YuO  2002-10-15 23:59:54  No: 76217

VBだけだと無理だと思いますよ。
元々,WM_SETFOCUSメッセージも,他のプロセスからフォーカスが来た場合,前に持っていたハンドルの情報がNULLですし。

メッセージフック使ってWM_KILLFOCUSをとにかく収集すれば,何とかなるかもしれません。


たかみちえ  URL  2002-10-16 04:20:05  No: 76218

YuOさんの言うとおりメッセージフックをするので正攻法でしょうけど、
ちょっと力技(正攻法に比べると負担がかかる)方法を…。

  まず、Timerコントロールを100ミリ秒以下くらいに設定しておいて、
そのイベント内で、常に今アクティブなウィンドウハンドルを
SetForegroundなどで取得して、もっておきます。
  それが自分のアプリケーションの持つウィンドウハンドルだったら持たないようにすれば…。
直前にアクティブだったウィンドウはすぐわかりますね。

  あとは必要なときにそのウィンドウをアクティブにしてCtrl+Cを送るなりすれば完成です。

  たとえほかの言語でやるにしても、メッセージフックはいろいろと面倒そうですから、
できるなら、あんまり使いたくないですね(-_-;)
やり方さえ覚えてしまえばどうということはないんでしょうけど。


  2002-10-16 19:17:42  No: 76219

YuOさん、たかみちさんありがとうございます
難しいようですね
たかみちえさん、すみません私は初心者みたいなものなので
ちょっと分からないところがあったのですが
SetForegroundでフォーカスがあるところを取得するのだと思いますが
どうしたら、直前にアクティブだったウィンドウをsetできるのでしょうか
>直前にアクティブだったウィンドウはすぐわかりますね。
と書いていただきましたが、正直分かりません。ごめんなさい。
WM_KILLFOCUSというのを使うのですか?
宜しくお願いします


たかみちえ  URL  2002-10-16 21:44:49  No: 76220

えと、ハンドルというものについてはもうわかりますか?
初心者掲示板のほうで何度か書いているので、
そこ参照ということで、詳しくは書きません。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200210/02100004.txt
ホームページにまとめようとしていますが、まだまとまってません(^^ゞ

  さて、ウィンドウハンドルはそれでいいとして^^;、
ウィンドウハンドルさえわかれば、SetForegroundWindowなどのAPIでアクティブにできます。
(上で間違えてますね(^^ゞアクティブウィンドウハンドルを得るのは、GetForegroundWindowです)

  さて、WM_KILLFOCUSというのは、ウィンドウメッセージの一種で、
使ったことはないですけど、その名前から"ウィンドウからフォーカスが失われるとき"に送られてくるものだと思います。
  YuOさんの言う正攻法は、メッセージフック(※)をして、このメッセージが来たときに、そのウィンドウハンドルを保存するという方法だと思います。
それだとわたしの言った方法に比べて、不必要に処理をする必要がなく、処理としては軽くなるでしょうね。
そこまで気を使わなくても、大体のパソコンではうまくやってくれると思いますけど。

  ※メッセージフック
  ウィンドウのメッセージが、そのウィンドウに送られる前に自作の関数を通し、
必要ならそれを改変したり、その内容を自分が知ったりできるようにする方法。
自分のアプリケーション以外のウィンドウフックをするには、DLLにその関数をおく決まりになっているので、
DLLを作れないVB単体で作ることはできない。
(ただしDLLだけほかの言語で作っておけば、VBでももちろんつかえる)
かくいうわたし、やったことないですけど。何かと面倒そうなので、いつも代替手段で乗り切っています。


  2002-10-17 18:57:03  No: 76221

たかみちえさんありがとうございます
ウィンドウハンドルというものは解りました
教えていただいたアドレスと、他のサイトの使用例を見てきましたが
直前までアクティブだったソフトのウィンドウハンドルは
どのように調べるのでしょうか。見つけた使用例では電卓の
ウィンドウハンドルを調べてみようとか、あらかじめソフトを決めて
調べる物だったのですが、不特定の直前までアクティブだった...
について記述があるところはありませんでした
よろしくお願いします。


たかみちえ  URL  2002-10-17 19:59:55  No: 76222

ええと、それは最初にわたしが書き込んだとおりです。
今アクティブだったウィンドウハンドルがわかれば、自分を無視することで、直前まででも可能ですね。
  無視するときは、自分のウィンドウがひとつのときは簡単ですけど、
二つ以上になるとややこしくなります。
Formsコレクションで何とかできないでしょうか?


  2002-10-19 00:27:54  No: 76223

たかみちえさん、ご指導ありがとうございました
最後は、どうどう巡りのような質問になってしまいましたが
GetForegroundWindowを使い2つのテキストボックスを用意して
直前と、現在のウィンドウハンドルの違いをだしCtrl+Cを送ることで
やりたいことができるようになりました。
(上手く伝えられませんが、とにかく成功です!)
何回もご親切にご指導いただき本当にありがとうございました


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

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






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