直前までアクティブだったwindow(メモ帳など)のテキストをクリップボード
経由でVBのテキストボックスにコピーしたいのですが方法は有りますか?
メモ帳でCtrl+Cを押せばよい事なのですが、VBからの操作で1ボタンで
コピー貼り付けをしたいです。アドバイスいただけたらうれしいです
よろしくお願いします。
VBだけだと無理だと思いますよ。
元々,WM_SETFOCUSメッセージも,他のプロセスからフォーカスが来た場合,前に持っていたハンドルの情報がNULLですし。
メッセージフック使ってWM_KILLFOCUSをとにかく収集すれば,何とかなるかもしれません。
YuOさんの言うとおりメッセージフックをするので正攻法でしょうけど、
ちょっと力技(正攻法に比べると負担がかかる)方法を…。
まず、Timerコントロールを100ミリ秒以下くらいに設定しておいて、
そのイベント内で、常に今アクティブなウィンドウハンドルを
SetForegroundなどで取得して、もっておきます。
それが自分のアプリケーションの持つウィンドウハンドルだったら持たないようにすれば…。
直前にアクティブだったウィンドウはすぐわかりますね。
あとは必要なときにそのウィンドウをアクティブにしてCtrl+Cを送るなりすれば完成です。
たとえほかの言語でやるにしても、メッセージフックはいろいろと面倒そうですから、
できるなら、あんまり使いたくないですね(-_-;)
やり方さえ覚えてしまえばどうということはないんでしょうけど。
YuOさん、たかみちさんありがとうございます
難しいようですね
たかみちえさん、すみません私は初心者みたいなものなので
ちょっと分からないところがあったのですが
SetForegroundでフォーカスがあるところを取得するのだと思いますが
どうしたら、直前にアクティブだったウィンドウをsetできるのでしょうか
>直前にアクティブだったウィンドウはすぐわかりますね。
と書いていただきましたが、正直分かりません。ごめんなさい。
WM_KILLFOCUSというのを使うのですか?
宜しくお願いします
えと、ハンドルというものについてはもうわかりますか?
初心者掲示板のほうで何度か書いているので、
そこ参照ということで、詳しくは書きません。
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でももちろんつかえる)
かくいうわたし、やったことないですけど。何かと面倒そうなので、いつも代替手段で乗り切っています。
たかみちえさんありがとうございます
ウィンドウハンドルというものは解りました
教えていただいたアドレスと、他のサイトの使用例を見てきましたが
直前までアクティブだったソフトのウィンドウハンドルは
どのように調べるのでしょうか。見つけた使用例では電卓の
ウィンドウハンドルを調べてみようとか、あらかじめソフトを決めて
調べる物だったのですが、不特定の直前までアクティブだった...
について記述があるところはありませんでした
よろしくお願いします。
ええと、それは最初にわたしが書き込んだとおりです。
今アクティブだったウィンドウハンドルがわかれば、自分を無視することで、直前まででも可能ですね。
無視するときは、自分のウィンドウがひとつのときは簡単ですけど、
二つ以上になるとややこしくなります。
Formsコレクションで何とかできないでしょうか?
たかみちえさん、ご指導ありがとうございました
最後は、どうどう巡りのような質問になってしまいましたが
GetForegroundWindowを使い2つのテキストボックスを用意して
直前と、現在のウィンドウハンドルの違いをだしCtrl+Cを送ることで
やりたいことができるようになりました。
(上手く伝えられませんが、とにかく成功です!)
何回もご親切にご指導いただき本当にありがとうございました
ツイート | ![]() |