Comment puis-je détecter si les données du presse-papiers doivent être copiées ou déplacées ?

la programmation


Je peux obtenir la liste des fichiers du presse-papiers mais je n’arrive pas à détecter si ces données sont destinées à être déplacées ou copiées ?

lorsque l’utilisateur clique sur les options « couper » et « coller », les données sont définies dans le presse-papiers et nous pouvons les récupérer à l’aide d’un code, mais comment pouvons-nous simultanément savoir si ces données du presse-papiers sont à copier ou à couper ?

Ce que j’ai essayé :

Je peux obtenir la liste des fichiers du presse-papiers en utilisant ce code :
Données IDataObject = Clipboard.GetDataObject();
si (!data.GetDataPresent(DataFormats.FileDrop))
retour;
chaîne[] clipboardData = (chaîne[])data.GetData(DataFormats.FileDrop);

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

Lors de la copie d’un fichier, il semble définir les indicateurs Copier et Lier, tandis que pour une coupe, il définit l’indicateur de bit Déplacer.

Solution 3

Certainement pas. Et vous n’en avez jamais besoin. Tout d’abord, une telle distinction n’existe pas. La question n’a tout simplement aucun sens.

Permettez-moi également d’expliquer cela : le “déplacement du presse-papiers” n’existe pas. Il s’agit d’une pure partie côté application. Vous venez de rater l’idée. Oui, certaines applications proposent des opérations « couper un fichier – fichier passé » qui sont fonctionnellement équivalentes à « déplacer », mais ce n’est qu’une métaphore. Dans le système d’exploitation, cela n’existe pas.

Un exemple est le « déplacement de fichiers ». Voici comment cela fonctionne : tout d’abord, l’application gère la commande “couper les fichiers” et marque simplement certains fichiers programmés pour le déplacement. Il est important de comprendre que rien n’est coupé. La commande suivante est censée être « coller des fichiers ». S’il est émis avant toute autre opération du presse-papiers, les fichiers sont simplement déplacés. Si l’utilisateur fait autre chose, la commande « couper » est simplement ignorée ; et les fichiers restent là où ils étaient. Si l’utilisateur émet cette commande, les fichiers sont déplacés. Les mêmes choses se produisent avec les cellules d’une feuille de calcul, y compris Excel.

Vous pouvez développer la même technique dans votre application. La question est : le presse-papiers du système est-il réellement impliqué ? La réponse est oui et non. Comme dans les deux exemples expliqués dans le paragraphe précédent, votre candidature peut être exécutée en une seule ou plusieurs instances du processus de candidature. Si c’était toujours le même exemple, utiliser le presse-papiers serait inutile. Mais la même application peut être exécutée dans plusieurs processus différents ; et les processus sont isolés. Ils ont besoin de communiquer sur cette activité de copier/coller/déplacer un fichier ; et cela se fait facilement via le presse-papiers système disponible. Tout ce dont vous avez besoin pour mettre en œuvre une chose similaire est un petit raisonnement logique.

De plus, en ce qui concerne la manipulation de fichiers : vous pouvez avoir plusieurs applications indépendantes en utilisant l’API Shell. Il s’agit non seulement de processus différents, mais également de processus d’applications différentes. Et ils peuvent communiquer via le presse-papiers du système, dans cet aspect.

C’est tout.

-SA

Solution 1

Cela n’est pas possible avec le Presse-papiers, cela est déterminé par l’application qui utilise le Presse-papiers. Désolé !

Solution 2

Lorsque vous utilisez le dépôt de fichiers, il vous suffit de cocher les touches Maj et Contrôle :

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

コメント

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