0

サード パーティ製アプリの開発者は、クリップボード データ以外にアクセスすることを必ずしも望んでいないことを理解しています。それでも、基になるクリップボードの内容を取得して、自分にとって役立つものを抽出したいとします。どうすればいいですか?これには、他のプロセスのメモリをいじることが含まれますか? または、dotnet でリフレクションを使用してクリップボード オブジェクトからプロパティを検出して抽出しようとしていますか? または、これにどのようにアプローチしますか?

ETA: わかりました。抽象度が低い方のために、例を考えてみましょう。Visual Studio のフォーム デザイナーで、いくつかのウィジェットを選択してコピーします。ここで、クリップボードを解析して、コピーしたばかりのウィジェットの名前、場所、サイズを見つけたいと思います (ビジュアル スタジオなどのプラグインを書きたくないので、特にクリップボードから情報を取得したい)。Visual Studio プロセスの 2 つのインスタンス間でウィジェット (名前、場所、その他のプロパティを含む) をコピーして貼り付けることができるという理由だけで、これが理論的に可能であることはわかっています。

4

1 に答える 1

2

データを から直接読み取ることができますSystem.Windows.Clipboard。それはとても簡単です!

いくつかのより難解なデータ形式で作業する必要があるかもしれませんが、データがクリップボードに保存されると、自由に読み取ることができます。Word の場合、クリップボードに配置される HTML 形式がニーズに非常に適していることに気付くかもしれません。

ユーザーがプログラムの実行に同意したため、セキュリティやプライバシーの問題はありません。ログインしている別のユーザーのクリップボードを読み取ることを許可するのは間違っていますが、それはできません。


あなたは質問を更新し、もう少し具体的なことを尋ねています。そこで、いくつかのウィジェットをクリップボードにコピーしてから、クリップボード ビューアーを使用してそこにある形式を確認しました。飛び出したのはCF_DESIGNERCOMPONENTS_V2。これを簡単にウェブ検索すると、次のウェブサイトにたどり着きました。

http://www.windowsdevelop.com/windows-forms-designer/for-designer-copycutpaste-what-type-data-format-does-ms-set-the-clipboard-dataobject-to-8507.shtml

デザイナーがコピー コマンドを処理する方法を示すリフレクターからのように見えるいくつかのコードがあります。

protected void OnMenuCopy(object sender, EventArgs e)
{
      if (this.SelectionService != null)
      {
            Cursor cursor1 = Cursor.Current;
            try
            {
                  Cursor.Current = Cursors.WaitCursor;
                  ICollection collection1 = this.GetCopySelection();
                  collection1 = this.PrependComponentNames(collection1);
                  IDesignerSerializationService service1 = (IDesignerSerializationService) this.GetService(typeof(IDesignerSerializationService));
                  if (service1 != null)
                  {
                        object obj1 = service1.Serialize(collection1);
                        MemoryStream stream1 = new MemoryStream();
                        new BinaryFormatter().Serialize(stream1, obj1);
                        stream1.Seek((long) 0, SeekOrigin.Begin);
                        byte[] buffer1 = stream1.GetBuffer();
                        IDataObject obj2 = new DataObject("CF_DESIGNERCOMPONENTS_V2", buffer1);
                        Clipboard.SetDataObject(obj2);
                  }
                  this.UpdateClipboardItems(null, null);
            }
            finally
            {
                  Cursor.Current = cursor1;
            }
      }
}

これで始められるはずです!

于 2011-03-08T20:05:13.720 に答える