- PR -

他のアプリケーションで選択(反転)したテキストをクリックボードにコピーする方法について

1
投稿者投稿内容
シゲル
常連さん
会議室デビュー日: 2004/04/03
投稿数: 27
投稿日時: 2004-04-03 10:44
プログラミングの勉強をはじめたばかりの超初心者です。
質問させてください。

現在、C#で次のような仕様のプログラムを作りたいと思っています。

常に最前面に表示するように設定した、
「コピー」というボタンがあるフォームで、
自分自身のフォーム内ではない、
他のアプリケーションのウィンドウ内で文字列を選択(反転)し、
自分のフォームの「コピー」ボタンをクリックすると、
他のウィンドウ内で選択したその文字列が
クリップボードに転送されるというプログラムです。

これを実現するためには、まず直前にアクティブだったウィンドウを
特定しなければならないと思うのですが、
それはどのようにすれば特定できるのでしょうか?

また、特定できたとして、そのウィンドウで選択(反転)した文字列は
どうすればクリップボードに転送できるのでしょうか?

自分のフォーム内であれば、超初心者のわたしでもできるのですが、
他のアプリケーションとなるとさっぱりその方法がわかりません。

いろいろと自分でも調べたのですが、
あまりの初心者でMSDN Libruaryに書いてあることもさっぱりです。
どうか、どなたかわかりやすく教えていただけたらと思います。



ant
常連さん
会議室デビュー日: 2004/03/24
投稿数: 44
投稿日時: 2004-04-03 23:55
基本的に、Officeのオートメーションのような機構を使わない限り、
何の関係も無いプログラムを外部から操作するのは結構面倒なことになってしまいます。

一つ目の直前にアクティブだったウィンドウの特定ですが、
GetWindowというWin32 API関数を使用することになります。
厳密にはフックということをしなければいけないのですが、(他の最前面表示のウィンドウ
から移った場合など)今回の場合はこれで大丈夫でしょう。
ただ、気をつけることはGetWindowで直下のウィンドウを検索する際
自分のウィンドウハンドルを一番最初に指定しますが、そこでは、一旦TopMost
プロパティをfalseに設定する必要があります。
簡単には以下のようになります。
コード:
	this.TopMost = false;
	IntPtr hd = this.Handle;
         	do
	{
		hd = GetWindow(hd, GW_HWNDNEXT);
	}while(hd != IntPtr.Zero && !IsWindowVisible(hd));
         this.TopMost = true;


GetWindowやIsWindowVisibleはWin32 API関数なので、別途宣言しておいてください。

二つ目の選択された文字列の転送ですが、
これは、その対象となるコントロールによると思われます。
リッチテキストボックスなどでしたら、EM_GETSELTEXTメッセージ等を
そのコントロールにSendMessageというWin32 APIを使用して送信
することになると思います。

全体的に、少々大変な作業になり得ます。
シゲル
常連さん
会議室デビュー日: 2004/04/03
投稿数: 27
投稿日時: 2004-04-04 09:36
>ant様

ご親切にご教授いただきありがとうございます。
さっそく、直前にアクティブだったウィンドウの特定を
教えていただいたコードを使ってやってみました。

}while(hd != IntPtr.Zero && !IsWindowVisible(hd)); 
の行で”[C# エラー] WinForm.cs(121): 演算子 '!' を 'int' 型のオペランドには適用することはできません。”というメッセージがでるので、
}while(hd != IntPtr.Zero && IsWindowVisible(hd) == 0);
としてみたら、きちんと動きました。
ありがとうございました。

引き続き、テキストの取得にも取り組もうと思います。







ant
常連さん
会議室デビュー日: 2004/03/24
投稿数: 44
投稿日時: 2004-04-04 10:54
引用:

}while(hd != IntPtr.Zero && !IsWindowVisible(hd)); 
の行で”[C# エラー] WinForm.cs(121): 演算子 '!' を 'int' 型のオペランドには適用することはできません。”というメッセージがでるので、


恐らく、IsWindowVisible関数の定義の戻り値がint型で宣言されている為では
ないでしょうか?実際IsWindowVisibleから返ってくる値は0かそれ以外の値ですが、
それはbool型と同じことなので、bool型で宣言すればいいと思います。
#シゲルさんのようにしても、問題ありませんが…
シゲル
常連さん
会議室デビュー日: 2004/04/03
投稿数: 27
投稿日時: 2004-04-04 12:34
>antさま

がびょーん!

なるほど!
boolにすればいいのか!
超初心者で恐縮です。

1

スキルアップ/キャリアアップ(JOB@IT)