¿Cómo puedo detectar si los datos en el portapapeles se pueden copiar o mover?

programación


Puedo obtener una lista de archivos del portapapeles pero no puedo detectar si estos datos son para mover o copiar.

Cuando el usuario hace clic en las opciones “cortar” y “pegar”, los datos se configuran en el portapapeles y podemos recuperarlos usando algún código, pero ¿cómo podemos saber simultáneamente si estos datos del portapapeles se pueden copiar o cortar?

Lo que he probado:

Puedo obtener una lista de archivos del portapapeles usando este código:
Datos IDataObject = Portapapeles.GetDataObject();
si (!data.GetDataPresent(DataFormats.FileDrop))
devolver;
cadena[] portapapelesData = (cadena[])datos.GetData(DataFormats.FileDrop);

Solución 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
}

Al copiar un archivo, parece configurar los indicadores Copiar y Vincular, mientras que para un corte establece el indicador Mover bit.

Solución 3

De ninguna manera. Y nunca lo necesitas. En primer lugar, no existe tal distinción. La pregunta simplemente no tiene sentido.

Permítanme explicarles también que no existe el “movimiento del portapapeles”. Esta es una parte puramente del lado de la aplicación. Simplemente te perdiste la idea. Sí, algunas aplicaciones ofrecen operaciones de “cortar archivo – pasar archivo”, lo que funcionalmente equivale a “mover”, pero esto no es más que una metáfora. En el sistema operativo no existe tal cosa.

Un ejemplo es “mover archivos”. Así es como funciona: primero, la aplicación maneja el comando “cortar archivos” y simplemente marca algunos archivos programados para mover. Es importante entender que no se corta nada. Se supone que el siguiente comando es “pegar archivos”. Si se emite antes de cualquier otra operación del portapapeles, los archivos simplemente se mueven. Si el usuario hace algo más, el comando “cortar” simplemente se ignora; y los archivos permanecen donde estaban. Si el usuario emite ese comando, los archivos se mueven. Lo mismo sucede con las celdas de una hoja de cálculo, incluido Excel.

Puede desarrollar la misma técnica en su aplicación. La pregunta es: ¿está involucrado el portapapeles del sistema? La respuesta es sí y no. Como en los dos ejemplos explicados en el párrafo anterior, su aplicación se puede ejecutar en una o varias instancias del proceso de solicitud. Si siempre fue el misma instancia, usar el portapapeles no tendría sentido. Pero una misma aplicación puede ejecutarse en varios procesos diferentes; y los procesos están aislados. Necesitan comunicarse sobre la actividad de copiar/pegar/mover este archivo; y esto se hace cómodamente a través del portapapeles del sistema disponible. Todo lo que necesitas para implementar algo similar es un poco de razonamiento lógico.

Además, en cuanto a la manipulación de archivos: puede tener varias aplicaciones no relacionadas utilizando Shell API. No sólo son procesos diferentes, sino incluso procesos de aplicaciones diferentes. Y pueden comunicarse a través del portapapeles del sistema, en este aspecto.

Eso es todo.

-SA

Solución 1

Esto no es posible con el Portapapeles, está determinado por la aplicación que utiliza el Portapapeles. Lo siento !

Solución 2

Cuando usas la opción de soltar archivos, simplemente marca las teclas Mayús y Control:

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

コメント

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