【解決方法】クリップボード内のデータがコピー用か移動用かを検出するにはどうすればよいですか?


クリップボードからファイルのリストを取得できますが、このデータが移動用なのかコピー用なのかがわかりません。

ユーザーが「切り取り」と「貼り付け」オプションの両方をクリックすると、データがクリップボードに設定され、コードを使用してそれを取得できますが、このクリップボードのデータがコピー用か切り取り用かを同時に取得するにはどうすればよいでしょうか?

私が試したこと:

次のコードを使用して、クリップボードからファイルのリストを取得できます。
IDataObject データ = Clipboard.GetDataObject();
if (!data.GetDataPresent(DataFormats.FileDrop))
戻る;
弦[] クリップボードデータ = (文字列[])data.GetData(DataFormats.FileDrop);

解決策 5

C#
[Flags]
public enum NativeDropEffect : uint
{
    None = 0x00000000,
    Copy = 0x00000001,
    Move = 0x00000002,
    Link = 0x00000004,
    Scroll = 0x80000000
}

IDataObject iData = System.Windows.Forms.Clipboard.GetDataObject();
var fileDrop = (string[])iData.GetData(DataFormats.FileDrop);
NativeDropEffect dropEffect;
using (var reader = new BinaryReader((MemoryStream)iData.GetData("Preferred DropEffect")))
{
    dropEffect = (NativeDropEffect)reader.ReadUInt32();
}

if(dropEffect.HasFlag(NativeDropEffect.Copy))
{
//copy
}
else if(dropEffect.HasFlag(NativeDropEffect.Move))
{
//cut
}

ファイルをコピーする場合は、コピー フラグとリンク フラグが設定されるように見えますが、カットの場合は移動ビット フラグが設定されます。

解決策 3

とんでもない。 そしてそれは決して必要ありません。 まず、そんな区別はありません。 その質問はまったく意味がありません。

それについても説明しておきます。「クリップボードの移動」などというものは存在しません。 これは純粋なアプリケーション側の部分です。 あなたはそのアイデアを見逃しただけです。 はい、一部のアプリケーションでは、「移動」と機能的に同等の「ファイルの切り取り – ファイルの貼り付け」操作が提供されていますが、これは比喩にすぎません。 OSではそのようなことはありません。

一例は「ファイルの移動」です。 これがその仕組みです。まず、アプリケーションは「ファイルのカット」コマンドを処理し、移動がスケジュールされているいくつかのファイルにマークを付けるだけです。 何もカットされていないことを理解することが重要です。 次のコマンドは「ファイルの貼り付け」であるはずです。 他のクリップボード操作の前に発行された場合、ファイルは単純に移動されます。 ユーザーが他のことをした場合、「cut」コマンドは単純に無視されます。 ファイルは元の場所に残ります。 ユーザーがそのコマンドを発行すると、ファイルが移動されます。 Excel などのスプレッドシートのセルでも同じことが起こります。

同じテクニックをアプリケーションでも開発できます。 問題は、システムのクリップボードが関係しているのかということです。 答えは「はい」でもあり「いいえ」です。 前の段落で説明した両方の例と同様に、アプリケーションは、アプリケーション プロセスの複数のインスタンスのうちの 1 つのインスタンスで実行できます。 それがいつもだったら 同じインスタンス、クリップボードを使用しても意味がありません。 ただし、同じアプリケーションを複数の異なるプロセスで実行することができます。 そしてプロセスは分離されます。 このファイルのコピー/貼り付け/移動アクティビティに関して通信する必要があります。 これは、利用可能なシステム クリップボードを介して簡単に実行できます。 同様のことを実装するために必要なのは、ちょっとした論理的推論だけです。

さらに、ファイル操作に関しては、シェル API を使用して、関連性のない複数のアプリケーションを実行できます。 それらは異なるプロセスであるだけでなく、異なるアプリケーションのプロセスでもあります。 この点では、システムのクリップボードを介して通信できます。

それだけです。

-SA

解決策 1

これはクリップボードでは不可能であり、クリップボードを使用するアプリケーションによって決定されます。 ごめん !

解決策 2

ファイル ドロップを使用するときは、Shift キーと Ctrl キーを確認するだけです。

C#
if ((ModifierKeys & Keys.Shift) != 0)
    {
    // It's a move operation.
    ...
    }

コメント

タイトルとURLをコピーしました