• 締切済み

クリップボードからの貼り付けのフック

VB.net、C#、.net framework2005で、 クリップボード拡張ソフトを開発しております。 クリップボードへの入出力が起こる直前にフックをかけたいです。 コピー・切り取り操作(ClipBoardへの入力)については クリップボードチェーンに自分を加え、WM_DRAWCLIPBOARDをハンドルすることで解決できました。 貼り付け(ClipBoardからの出力)についてはどのようにすれば実現できますでしょうか? 貼り付けイベントが起こった時に、チェーン内のプログラムにそれを通知するようなWindowsメッセージがあるかと思い、それらしいものを探してみたのですが、利用できそうなものがありませんでした… 具体的には、 ・入力時に、データを加工して仮想クリップボードに格納 ・出力時に、仮想クリップボード内のデータを再度加工して出力(貼り付け) という処理を実現したいです。 宜しくお願い致します。

  • i_110
  • お礼率60% (28/46)

みんなの回答

回答No.1

 こんばんは。回答が付かないようですので。  外部の誰かがクリップボードを変更した瞬間に受け取りたいと言う事でしょうか。  クリップボードビューワに自分のウィンドウが登録されていれば、WM_DRAWCLIPBOARDで変更通知を受け取れる筈です。  http://jo0ls-dotnet-stuff.blogspot.com/2008/12/setclipboardviewer-api-vbnet.html  以下はクリップボードへビットマップが入る度にメッセージを出します。  PrintScreenキーを押してスクリーンショットを取れば直に確認出来ます。 Public Class Form1 Declare Unicode Function SetClipboardViewer Lib "user32.dll" (ByVal hWnd As IntPtr) As IntPtr Declare Unicode Function ChangeClipboardChain Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal hWndNext As IntPtr) As Int32 Declare Unicode Function OpenClipboard Lib "user32.dll" (ByVal hWnd As IntPtr) As Int32 Declare Unicode Function CloseClipboard Lib "user32.dll" () As Int32 Declare Unicode Function GetClipboardData Lib "user32.dll" (ByVal uiFormat As UInt32) As IntPtr Const WM_CHANGECBCHAIN = &H30D Const WM_DRAWCLIPBOARD = &H308 Const CF_BITMAP = &H2 Private hWndNext As IntPtr Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '自分をクリップボードビューワーに登録 Me.hWndNext = SetClipboardViewer(Me.Handle) End Sub Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed '自分をクリップボードビューワーから解除 ChangeClipboardChain(Me.Handle, Me.hWndNext) End Sub Protected Overrides Sub WndProc(ByRef m As Message) Select Case m.Msg Case WM_DRAWCLIPBOARD 'クリップボードの中を開いてビットマップだったらメッセージを出す OpenClipboard(Me.Handle) Dim hClipboard As IntPtr = GetClipboardData(CF_BITMAP) CloseClipboard() If hClipboard <> IntPtr.Zero Then MsgBox("クリップボードにビットマップが来ました") End If m.HWnd = Me.hWndNext Case WM_CHANGECBCHAIN If Me.hWndNext = m.WParam.ToInt32() Then Me.hWndNext = m.LParam.ToInt32() ElseIf Me.hWndNext <> IntPtr.Zero Then m.HWnd = Me.hWndNext End If End Select MyBase.WndProc(m) End Sub End Class

i_110
質問者

補足

御回答ありがとうございます。 質問の仕方が悪かったかもしれません。 それは上で言うクリップボードへの入力の際の話(クリップボードへの変更通知)ですよね?それに関しては仰るとおりWM_DRAWCLIPBOARDをハンドルすることで解決しております。 やりたいことは、システム全体での貼り付け行為(Ctrl+V)を監視して、その直前に処理を差し込むことです。具体的には、クリップボードのデータをその都度の任意のものに差し替えたいと思います。 キー(Ctrl+V)のグローバルフックでも出来ないことは無いのですが、キーの押しっぱなし等で連続して貼り付けが起こった場合、クリップボードのデータの同期タイミングにズレが生じます。 つまり、例えば貼り付けの度に連番(1,2,3...)を出力するような処理を差し込むとして、  1.Ctrl+V検知  2.クリップボードデータをn+1に差し替え(その後n++)  3.CallNextHookExで処理を流す  4.システムが貼り付け操作を実行 このフローにおいて、システムが4の操作を完了する前に新たなキーフックを検知してしまうと、貼り付け前にデータ差し替えが起こってしまい、実際の出力が1,2,4,5...等と歯抜けになってしまう問題に直面しています。 標題の質問に限らず、この問題を解決する何か良い方法をご存知の方、ご教示下さい。 宜しくお願い致します。

関連するQ&A

  • pascalでのクリップボードの使い方

    pascalであらかじめ用意してある文章をクリップボードを利用して、他の場所に貼り付けができるようにするプログラムを作くろうと思っているのですが少しうまい具合にいかなくて困っています。 文章をコピーするときなのですがeditなどの一列の文はクリップボードのClipboard.AsTextで出来たのですが、memoのような改行されるようなものが出来ませんでした。改行される文をクリップボードに移したいときはどうすればよいでしょうか?

  • C#で画像をクリップボードへのコピーと貼り付けについて

    GraphicsオブジェクトのDrawImageメソッドを使って画像を表示させています。 この画像をクリップボードへコピーしてほかのところに貼り付けしたいのですが、クリップボードへはClipboard.SetDataObject()を使用すればよいと思っています。 しかし、どのように使ったらいいのかよくわかりません。現在のソースは以下のようになっています。 //Bitmapオブジェクトの作成(画像ファイルを読み込む) Bitmap bmap = new Bitmap(@"C:\test2.bmp"); //元の画像からの切り取り範囲の指定 RectangleF rectSrc = new RectangleF                 (pointX,pointY,WidthX,WidthY); //貼り付け先を指定範囲の指定 RectangleF rectDst = new RectangleF(0, 0, DstX,DstY); //PictureBox1のGraphicsオブジェクトの作成 Graphics g= pictureBox1.CreateGraphics(); //画像の描画 g.DrawImage(bmap, rectDst,rectSrc,GraphicsUnit.Pixel); //クリップボードへのコピー Clipboard.SetDataObject(g); よろしくおねがいいたします。

  • vcc+でクリップボードについて

    今、Aのフォルダーにあるファイルをすべてクリップボードに切り取りたいのですが、いたるサイトで探しても データーの切り取りはあってもファイルの切り取りが見当たらなくて困っています。 どのようにすれば出来ますか? よろしくお願いいたします。

  • VC++2008 で クリップボードの監視を行いたい

    いつもおせわになっております。 ただいま、Visual C++ 2008 Express Edition を使いまして、クリップボード拡張アプリを作っております。 実装したい機能として・・・  A.クリップボードにデータがコピーされる度に、クリップボードのデータを取得する。  B.ただし、クリップボード上のデータは消さない。 というものがあります。 この使用を実装するために、下記のようにデータ存在の有無をタイマーな どでポーリングすれば良いと考えました。 >IDataObject ^data = System::Windows::Forms::Clipboard::GetDataObject(); >pictureShowPicture->Image->Dispose(); >if(data->GetDataPresent(DataFormats::Bitmap) == true){ しかし、この方法だと、一回でもデータがクリップボードにコピーされると、その後もずっと「データが存在する」状態となってしまい、新しいデータが来たのかどうか判断が出来ません。 クリップボード上のデータを消せば、「データが存在しない」状態となり、次にデータがコピーされたことが分かるのですが、クリップボード上のデータは消さない実装としたいのです。 このため、下記のようにすれば問題が解決できると思いました。  1.何らかの方法でクリップボードにデータがコピーされたという通知を受け取る。  2.現在のデータが直前のデータと同じか異なるかを判断する。    (ポーリングしておいて、データが異なれば新規データと判断) 上記1,2について、実現方法をご存知の方は教えていただけませんでしょうか。 ちなみに、受け取りたいデータ形式は、ビットマップ形式画像およびテキスト形式です。 お忙しいところ恐縮ですが、よろしくお願いいたします。

  • 仮想マシンとのクリップボード共有について

    仮想マシンとのクリップボード共有について 「Microsoft Virtual PC 2007」で構築されたCentOSに、ホスト(WinXP)との間に、クリップボードの共有は現在できていません。どうすれば、実現できるのか、教えてください。 現在は、ホストと仮想の間に、sambaでフォルダを公開しています(データファイルの共有できる)。ただし、文字列のコピーは残念ですができていません。HPを検索しても、なかなか満足な回答は見当たらなく、困っています。

  • VBScriptでクリップボードにコピーする方法

    VBScriptでクリップボードにMsgboxの出力データをコピーする方法がわかりません。 ちなみにMsgboxの出力データは変数で、処理の流れとしてMsgboxのすぐ後に クリップボード上に変数をコピーをするようにしたいと考えています。 ネットで検索した結果、下記内容がありましたが、1年前くらいにまったく同じ目的のVBScriptを作成したことがあり、その時は特に制限なく目的のVBScriptが作成できたので、どうも納得できません。 その時のを残しておけばよかったと今になって後悔。。。しかもどうやったか忘れた。。。。 ===ネット検索結果=== WSH と VBScript のいずれにもクリップボードを操作する機能はありません。どちらを使用しても、クリップボードにデータをコピーしたりクリップボードからデータを貼り付けたりすることはできません。一方、Internet Explorer ではクリップボードを操作することができます。 他にもネット上で、とりあえずInputBoxに出力してコピーするような流れの内容がありましたが、今回の目的(見栄えとして)として、どうしてもMsgboxのすぐ後で処理させたいのでわかる方おりましたら宜しくお願いします。

  • クリップボードの保存について

    初めて質問させて頂きます。 EXCELのクリップボード機能について質問したいのですが、クリップボード内に何個かデータを記憶させた場合、PCを落としたり、EXCELファイルを閉じた時に再度ファイルを開いた時にクリップボードの内容が記憶されているようにできるのでしょうか?

  • クリップボードのバグでしょうか?

    WindowsXPを使用しているのですが、マウスの右ボタンでコピーは出来るのですが、貼り付けがグレーになっています。 文章でも画像でも同じ現象で、すべてのアプリでクリップボードが使用不可能になってしまいました。 名前を指定して実行で、「clipbrd」と入力し、クリップボードの中身を確認した所、常にデスクトップの状態が画像表示されています。 リアルタイムでクリップボードに最新のデスクトップ表示をコピーしているような状態に見えます 何かのウイルスなのか、バグなのか・・・ 解決方法があれば、ご教授お願いします・・・

  • エクセルのマクロでクリップボードの使い分け。

    マクロ初心者です。任意のシートの任意の列(先に選択しておきます。)とそのシートのA列を特定のシートの2列に並べてコピーしたいのですが、クリップボードを使ってマクロ記録をしても、実行すると貼り付けの段階でエラーが起こります。クリップボードの中身を一つ目のデータ、二つ目のデータというように、選択して貼り付けすることは無理なのでしょうか。あるいは、一つ目のデータをコピー・貼り付けした後、元の任意のシートに戻る方法はないでしょうか。どなたか教えてください。よろしくお願いします。Excel2000を使っています。

  • 必要とする領域をクリップボード経由に貼り付けとは

    『必要とする領域をクリップボード経由に貼り付け』 の言葉を理解しても… 実際どうやるのかがよくわかりません。 現在、私は『文ちゃんのグラフ』を使う為に↓をや実行しているのですが… 必要なスクリーンキャプチャーソフト(SCAPを持ってきました)を持って来ても 『必要とする領域をクリップボード経由に貼り付け』がわからない為、滞ってます。 【数学の教師をしているので、配布する資料にグラフを入れたい場合があります.Wordを使っているので数式はきれいに入力できます(≦≧を入れることができないのでちょっと困ります)がグラフは簡単には入力できません.そこで簡単にグラフが描けるツールを作ってみました.OLEのサバーの機能はないので、スクリーンキャプチャーソフト(SCAP,SHOOT!などは別途用意してください)で必要とする領域をクリップボード経由で貼り付けてください.】 面倒なのは承知ですが誰か助けて下さい。 ―――――― 『文ちゃんのグラフ』に拘る理由は以下の通りです。 ちなみに、『文ちゃんのグラフ』以外に『BearGraph』でやったのですが… 例外だったらしく無理でした。 確かに図表には描けないグラフは(高校数学にも)存在しますが 今回はそうではないはずなので 高校程度の数学なら描けると謳っている『文ちゃんのグラフ』を使う次第です。

専門家に質問してみよう