Bagaimana cara mendeteksi apakah data di clipboard untuk disalin atau dipindahkan?

pemrograman


Saya bisa mendapatkan daftar file dari clipboard tetapi saya tidak dapat mendeteksi apakah data ini untuk dipindahkan atau disalin?

ketika pengguna mengeklik opsi “potong” dan “tempel”, data disetel ke papan klip dan kita dapat mengambilnya menggunakan beberapa kode, tetapi bagaimana kita bisa mengetahui secara bersamaan apakah data papan klip ini untuk disalin atau dipotong?

Apa yang saya coba:

Saya bisa mendapatkan daftar file dari clipboard menggunakan kode ini:
IDataObject data = Papan Klip.GetDataObject();
if (!data.GetDataPresent(DataFormats.FileDrop))
kembali;
rangkaian[] clipboardData = (string[])data.GetData(DataFormats.FileDrop);

Solusi 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
}

Saat menyalin file, tampaknya menyetel tanda Salin dan Tautan, sedangkan untuk pemotongan, ia menyetel tanda Pindahkan bit.

Solusi 3

Mustahil. Dan Anda tidak pernah membutuhkannya. Pertama-tama, tidak ada perbedaan seperti itu. Pertanyaan itu tidak masuk akal.

Izinkan saya juga menjelaskan bahwa: tidak ada yang namanya “pemindahan clipboard”. Ini adalah bagian sisi aplikasi murni. Anda baru saja melewatkan idenya. Ya, beberapa aplikasi menawarkan operasi “potong file – file masa lalu” yang secara fungsional setara dengan “memindahkan”, tetapi ini hanyalah metafora. Di OS, tidak ada hal seperti itu.

Salah satu contohnya adalah “memindahkan file”. Begini cara kerjanya: pertama, aplikasi menangani perintah “potong file” dan cukup menandai beberapa file yang dijadwalkan untuk dipindahkan. Penting untuk dipahami bahwa tidak ada yang dipotong. Perintah selanjutnya seharusnya adalah “tempel file”. Jika dikeluarkan sebelum operasi clipboard lainnya, file akan dipindahkan begitu saja. Jika pengguna melakukan hal lain, perintah “potong” diabaikan begitu saja; dan file-file itu tetap berada di tempatnya semula. Jika pengguna mengeluarkan perintah itu, file akan dipindahkan. Hal yang sama terjadi pada sel spreadsheet, termasuk Excel.

Anda dapat mengembangkan teknik yang sama di aplikasi Anda. Pertanyaannya adalah: apakah clipboard sistem terlibat? Jawabannya adalah: ya dan tidak. Seperti pada kedua contoh yang dijelaskan di paragraf sebelumnya, aplikasi Anda dapat dieksekusi dalam satu contoh, dari beberapa contoh proses aplikasi. Jika itu selalu contoh yang sama, menggunakan clipboard tidak ada gunanya. Namun aplikasi yang sama dapat dijalankan dalam beberapa proses berbeda; dan prosesnya terisolasi. Mereka perlu berkomunikasi tentang aktivitas salin/tempel/pemindahan file ini; dan ini mudah dilakukan melalui clipboard sistem yang tersedia. Yang Anda perlukan untuk menerapkan hal serupa hanyalah sedikit alasan logis.

Selain itu, mengenai manipulasi file: Anda dapat memiliki beberapa aplikasi yang tidak terkait menggunakan Shell API. Tidak hanya prosesnya yang berbeda, tetapi bahkan proses dari aplikasi yang berbeda. Dan mereka dapat berkomunikasi melalui clipboard sistem, dalam aspek ini.

Itu saja.

-SA

Solusi 1

Hal ini tidak mungkin dilakukan dengan Clipboard, ini ditentukan oleh aplikasi yang menggunakan Clipboard. Maaf !

Solusi 2

Saat Anda menggunakan file drop, Anda cukup memeriksa tombol shift dan kontrol:

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

コメント

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