DOBON.NET DOBON.NETプログラミング掲示板過去ログ

他のアプリケーションのテキストデータをクリップボード経由で取得するには

環境/言語:[環境=WindowsXP, 使用言語=C#]
分類:[.NET]

まだC#の勉強をはじめたばかりの超初心者です。

WordやnotepadやWebブラウザなど他のアプリケーションで
表示されているテキストデータを選択(反転)させて
C#で作ったフォームのボタンをクリックすると、
その選択(反転)されたテキストデータを
クリップボードに転送したいのですが、
どうすればよいのでしょうか?

教えてください。

要は、「どぼん!の.NET Tips」にあった以下のサンプルの
"コピーする文字列です。"とある部分を他のアプリケーションから
持ってきたいのですがやり方がわからないのです。

[C#]
//クリップボードに文字列をコピーする
//アプリケーション終了後、クリップボードからデータは削除される
Clipboard.SetDataObject("コピーする文字列です。");
//アプリケーション終了後もクリップボードにデータを残しておく
Clipboard.SetDataObject("コピーする文字列です。", true);
■No3292に返信(超初心者さんの記事)
> まだC#の勉強をはじめたばかりの超初心者です。
>
> WordやnotepadやWebブラウザなど他のアプリケーションで
> 表示されているテキストデータを選択(反転)させて
> C#で作ったフォームのボタンをクリックすると、
> その選択(反転)されたテキストデータを
> クリップボードに転送したいのですが、
> どうすればよいのでしょうか?
>
> 教えてください。
>
> 要は、「どぼん!の.NET Tips」にあった以下のサンプルの
> "コピーする文字列です。"とある部分を他のアプリケーションから
> 持ってきたいのですがやり方がわからないのです。
>
> [C#]
> //クリップボードに文字列をコピーする
> //アプリケーション終了後、クリップボードからデータは削除される
> Clipboard.SetDataObject("コピーする文字列です。");
> //アプリケーション終了後もクリップボードにデータを残しておく
> Clipboard.SetDataObject("コピーする文字列です。", true);
>
>

それはかなりむずかしいでしょう。まず、ソフトウェアによってまったくやりかたが異なるでしょうし、まず、それ自体が難しいことです。ソフトウェアのほうがAPIを公開していればできます。
> それはかなりむずかしいでしょう。
> まず、ソフトウェアによってまったくやりかたが異なるでしょうし、
> まず、それ自体が難しいことです。
> ソフトウェアのほうがAPIを公開していればできます。

そんなに難しいんですか・・・
でも、たとえばどんなアプリケーションに表示されているテキストでも
それを選択して、「Ctrl+C」するとその文字列がクリップボードに
コピーされますよね?
それと同じことをC#のフォームのボタンで実現したいのですが、
やっぱり難しいでしょうか?
■No3294に返信(超初心者さんの記事)
>>それはかなりむずかしいでしょう。
>>まず、ソフトウェアによってまったくやりかたが異なるでしょうし、
>>まず、それ自体が難しいことです。
>>ソフトウェアのほうがAPIを公開していればできます。
>
> そんなに難しいんですか・・・
> でも、たとえばどんなアプリケーションに表示されているテキストでも
> それを選択して、「Ctrl+C」するとその文字列がクリップボードに
> コピーされますよね?
> それと同じことをC#のフォームのボタンで実現したいのですが、
> やっぱり難しいでしょうか?
>

それでしたら、メニューにコピーの項目を追加して、メニューのShortcutプロパティで設定すれば、CtrlCが押されたときにそのメニューにのClickedイベントが発生します。そして、あらかじめ文字列をクリップボードにコピーするメソッドを作成しておいて、それをデリゲートで指定すればできます。

言いたいのはこういうことでしょうか?
しかし、最初の投稿を読ませていただいたかぎり、どうも違うようにおもわれます。ほかのアプリケーション内部にかかわることはなかなか難しいです。
自分のアプリケーション内で文字列をクリップボードにコピーする機能を実装するのは簡単ですが、ほかのアプリケーションを呼び出すことはとても難しいです。アプリケーションがAPIを提供していない限り、ほぼ不可能でしょう。
> それでしたら、メニューにコピーの項目を追加して、メニューのShortcutプロパティで設定すれば、CtrlCが押されたときにそのメニューにのClickedイベントが発生します。そして、あらかじめ文字列をクリップボードにコピーするメソッドを作成しておいて、それをデリゲートで指定すればできます。
>
> 言いたいのはこういうことでしょうか?
> しかし、最初の投稿を読ませていただいたかぎり、どうも違うようにおもわれます。ほかのアプリケーション内部にかかわることはなかなか難しいです。
> 自分のアプリケーション内で文字列をクリップボードにコピーする機能を実装するのは簡単ですが、ほかのアプリケーションを呼び出すことはとても難しいです。アプリケーションがAPIを提供していない限り、ほぼ不可能でしょう。


もう一度やりたいことを説明させていただきます。

自分のフォーム内のテキストであれば、
それを選択した後、ボタンをクリックすると
クリップボードに転送するという方法はわかるのですが、
わたしがやりたいのは、自分のフォーム内ではなくて、
他のアプリケーションでディスプレイに表示されているテキストを選択して
自分のフォームのボタンをクリックするとクリップボードに転送するということです。

やっぱり難しいですか?
■No3297に返信(超初心者さんの記事)
>>それでしたら、メニューにコピーの項目を追加して、メニューのShortcutプロパティで設定すれば、CtrlCが押されたときにそのメニューにのClickedイベントが発生します。そして、あらかじめ文字列をクリップボードにコピーするメソッドを作成しておいて、それをデリゲートで指定すればできます。
>>
>>言いたいのはこういうことでしょうか?
>>しかし、最初の投稿を読ませていただいたかぎり、どうも違うようにおもわれます。ほかのアプリケーション内部にかかわることはなかなか難しいです。
>>自分のアプリケーション内で文字列をクリップボードにコピーする機能を実装するのは簡単ですが、ほかのアプリケーションを呼び出すことはとても難しいです。アプリケーションがAPIを提供していない限り、ほぼ不可能でしょう。
>
>
> もう一度やりたいことを説明させていただきます。
>
> 自分のフォーム内のテキストであれば、
> それを選択した後、ボタンをクリックすると
> クリップボードに転送するという方法はわかるのですが、
> わたしがやりたいのは、自分のフォーム内ではなくて、
> 他のアプリケーションでディスプレイに表示されているテキストを選択して
> 自分のフォームのボタンをクリックするとクリップボードに転送するということです。
>
> やっぱり難しいですか?

詳しいことはわかりませんが、少なくとも、容易でないことは確かですね。

他のアプリケーションないの文字列を取得するソフトウェアを開発している方々がいらっしゃいます。そういった方々に問い合わせるのがいいのでしょうが、簡単に教えてくれるかどうかはわかりませんし・・・

う〜〜ん
どのあたりで悩まれているのでしょう?
まずは FindWindow 等で目的のウィンドウを特定しますよね。
それから EnumChildWindows でコントロールを列挙し、GetWindowText でキャプションを取るか、EnumProps でプロパティキーを列挙して GetProp すれば大抵のものは取得できるような気がします。
■No3301に返信(通りすがりさんの記事)
> どのあたりで悩まれているのでしょう?
> まずは FindWindow 等で目的のウィンドウを特定しますよね。

ご回答いただきありがとうございます。
お返事が遅れて恐縮です。
質問させてください。

今わたしは次のような仕様のプログラムを作りたいと思っています。

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

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

まずはここから教えてください。
↓の件は続いて質問させてください。


> それから EnumChildWindows でコントロールを列挙し、GetWindowText でキャプションを取るか、EnumProps でプロパティキーを列挙して GetProp すれば大抵のものは取得できるような気がします。
>
>
直前にアクティブだったウィンドウの特定については問題が解決しました。
ありがとうございました。

次に、特定された、他のアプリケーションのウィンドウ内で
選択(反転)された文字列を取得する方法ですが、
これはまだよくわかりません。

どなたかご存知であれば教えてください。


とりあえず、前に教えてもらった下の方法を試してみようと思います。

>それから EnumChildWindows でコントロールを列挙し、
>GetWindowText でキャプションを取るか、
>EnumProps でプロパティキーを列挙して
>GetProp すれば大抵のものは取得できるような気がします。
こんにちは。

Ctrl+cと同じ動きをさせたいだけであれば「SendKeysクラス」を使う手もあると思います。
(実際にCtrl+cの動作は試した事はありませんが)
SendKeysクラスの使い方については下記のアドレスにのってます。

http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformssendkeysclasstopic.asp

ただ、以前VB5でSendKeysを使用したプログラムがOSが98から2000に切り替えた時に
若干あやしい動きをした経験があります。
あまり良い方法ではないでしょうが、それでも試してみる価値はあると思います。

■No3481に返信(超初心者さんの記事)
> 直前にアクティブだったウィンドウの特定については問題が解決しました。
> ありがとうございました。
>
> 次に、特定された、他のアプリケーションのウィンドウ内で
> 選択(反転)された文字列を取得する方法ですが、
> これはまだよくわかりません。
>
> どなたかご存知であれば教えてください。
>
>
> とりあえず、前に教えてもらった下の方法を試してみようと思います。
>
> >それから EnumChildWindows でコントロールを列挙し、
> >GetWindowText でキャプションを取るか、
> >EnumProps でプロパティキーを列挙して
> >GetProp すれば大抵のものは取得できるような気がします。
>
>
>
>
■No3527に返信(.net勉強中さんの記事)
> こんにちは。
>
> Ctrl+cと同じ動きをさせたいだけであれば「SendKeysクラス」を使う手もあると思います。
> (実際にCtrl+cの動作は試した事はありませんが)
> SendKeysクラスの使い方については下記のアドレスにのってます。
>
> http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformssendkeysclasstopic.asp
>
> ただ、以前VB5でSendKeysを使用したプログラムがOSが98から2000に切り替えた時に
> 若干あやしい動きをした経験があります。
> あまり良い方法ではないでしょうが、それでも試してみる価値はあると思います。

実はすでにSendKeyを試してみました。
しかし、思ったようには動いてくれないようです。

DOBON.NET | プログラミング道 | プログラミング掲示板