Làm cách nào để phát hiện dữ liệu trong clipboard là để sao chép hay di chuyển?

lập trình


Tôi có thể lấy danh sách các tập tin từ clipboard nhưng tôi không thể phát hiện xem dữ liệu này là để di chuyển hay sao chép?

Khi người dùng nhấp vào cả hai tùy chọn “cắt” và “dán”, dữ liệu được đặt vào bảng tạm và chúng tôi có thể truy xuất nó bằng một số mã nhưng làm cách nào chúng tôi có thể đồng thời biết liệu dữ liệu bảng tạm này là để sao chép hay cắt?

Những gì tôi đã thử:

Tôi có thể lấy danh sách các tập tin từ clipboard bằng mã này:
Dữ liệu IDataObject = Clipboard.GetDataObject();
if (!data.GetDataPresent(DataFormats.FileDrop))
trở lại;
sợi dây[] clipboardData = (chuỗi[])data.GetData(DataFormats.FileDrop);

Giải pháp 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
}

Khi sao chép một tập tin, nó xuất hiện để đặt cờ Sao chép và Liên kết, trong khi để cắt, nó sẽ đặt cờ Di chuyển bit.

Giải pháp 3

Không đời nào. Và bạn không bao giờ cần nó. Trước hết, không có sự phân biệt như vậy. Câu hỏi đơn giản là vô nghĩa.

Tôi cũng xin giải thích rằng: không có cái gọi là “di chuyển clipboard”. Đây là một phần phía ứng dụng thuần túy. Bạn vừa bỏ lỡ ý tưởng. Có, một số ứng dụng cung cấp thao tác “cắt tệp – tệp quá khứ” có chức năng tương đương với “di chuyển”, nhưng đây chỉ là một phép ẩn dụ. Trong hệ điều hành, không có điều đó.

Một ví dụ là “di chuyển tập tin”. Đây là cách nó hoạt động: đầu tiên, ứng dụng xử lý lệnh “cắt tệp” và chỉ cần đánh dấu một số tệp đã được lên lịch để di chuyển. Điều quan trọng là phải hiểu rằng không có gì bị cắt giảm. Lệnh tiếp theo được cho là “dán tập tin”. Nếu nó được phát hành trước bất kỳ thao tác clipboard nào khác, các tệp sẽ chỉ được di chuyển. Nếu người dùng làm điều gì khác, lệnh “cắt” sẽ bị bỏ qua; và các tập tin vẫn giữ nguyên vị trí của chúng. Nếu người dùng đưa ra lệnh đó, các tập tin sẽ được di chuyển. Điều tương tự cũng xảy ra với các ô của bảng tính, bao gồm cả Excel.

Bạn có thể phát triển kỹ thuật tương tự trong ứng dụng của mình. Câu hỏi đặt ra là: bảng tạm hệ thống có liên quan không? Câu trả lời là có hoặc không. Như trong cả hai ví dụ được giải thích ở đoạn trước, ứng dụng của bạn có thể được thực thi trong một phiên bản của một số phiên bản của quy trình ứng dụng. Nếu nó luôn luôn là cùng một trường hợp, sử dụng clipboard sẽ là vô nghĩa. Nhưng cùng một ứng dụng có thể được thực thi trong nhiều quy trình khác nhau; và các quá trình được cô lập. Họ cần trao đổi về hoạt động sao chép/dán/di chuyển tệp này; và điều này được thực hiện một cách thuận tiện thông qua bảng tạm hệ thống có sẵn. Tất cả những gì bạn cần để thực hiện điều tương tự là một chút lý luận logic.

Hơn nữa, đối với thao tác với tệp: bạn có thể có nhiều ứng dụng không liên quan bằng Shell API. Chúng không chỉ là các quy trình khác nhau mà ngay cả quy trình của các ứng dụng cũng khác nhau. Và họ có thể giao tiếp thông qua bảng ghi tạm hệ thống ở khía cạnh này.

Đó là tất cả.

-SA

Giải pháp 1

Điều này là không thể với Clipboard, nó được xác định bởi ứng dụng sử dụng Clipboard. Lấy làm tiếc !

Giải pháp 2

Khi sử dụng tính năng thả tập tin, bạn chỉ cần kiểm tra phím shift và phím điều khiển:

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

コメント

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