私は、クリップボードを使用する必要がある小さなアプリケーションをいくつかの機能のために作成しようとしています。現在クリップボードにあるユーザーのデータを上書きしたくないので、私はそれをメモリに保存し、仕事をしてからそれを書き返すことに決めました。以下のコードは、私がしようとしているもののベアボーンの例であるコンソールアプリケーションです。クリップボードアクセスの不自然さ
私が抱えている問題は、状態を復元することです。アプリケーションを実行する前に何かをVisual Studioからクリップボードにコピーすると、クリップボードには合計6つのオブジェクト(さまざまな文字列形式とロケール)がキャッシュに入れられます。ロケールだけがクリップボードにあり、SetData()の各呼び出しが最後のものを上書きするように見えますが、それらを復元すると、 (ちなみに、SetDataObjectはGetDataObjectの逆ではないので、私はそれを使うことはできません)
どのようにしてクリップボードの状態を保存して後で復元できますか?
[STAThread]
static void Main(string[] args)
{
//Store the old clipboard data
Dictionary<string, object> clipboardCache = new Dictionary<string, object>();
IDataObject clipboardData = Clipboard.GetDataObject();
foreach (string format in clipboardData.GetFormats())
{
clipboardCache.Add(format, clipboardData.GetData(format));
}
Clipboard.SetText("Hello world!");
string value = Clipboard.GetText();
Console.WriteLine(value);
//Clear the clipboard again and restore old data
Clipboard.Clear();
foreach (KeyValuePair<string, object> valuePair in clipboardCache)
{
Clipboard.SetData(valuePair.Key, valuePair.Value);
Thread.Sleep(100);
}
Console.ReadLine();
}
あなたはClipXのような任意の複数のオブジェクト・クリップボードのプラグインを使用している:私はあなたはそれがあまりにも複雑作っているとあなたのコードは、このようなものであるべきだと思いますか? – TheVillageIdiot
コードスニペットは実際に私の問題を完全に解決しましたが、あなたのものとはまったく異なりますが、ここでGoogleを紹介しますので、ここで詳しく説明します:コンソールアプリケーションからWindowsクリップボードにアクセスするのに問題がある人は、 "[STAThread]"属性を持つメソッド! :D – BrainSlugs83