web-dev-qa-db-fra.com

Le glisser-déposer C # ne fonctionne pas sous Windows 7

J'ai eu un projet pendant un bon moment en utilisant des winforms C #. J'ai implémenté une fonction glisser-déposer avant la sortie de Windows 7. Travaillé comme un charme. Cependant, sous Windows 7, cela ne fonctionne pas. L'événement n'est même pas déclenché.

AllowDrop est défini sur true. Lorsque vous vous abonnez à DragEnter, Windows 7 ne l’appelle pas (vous n’êtes pas sûr de Vista). Mais sur XP, cela fonctionne complètement. Le programme est exécuté avec des privilèges administritave.

Existe-t-il une différence de glissement dans Windows 7 vs XP? Je ne sais pas si c'est pertinent, mais j'utilise x64

44
Oskar Kjellin

Les processus source et cible doivent disposer de niveaux de sécurité\privilèges compatibles. Par exemple, si votre source est Explorer et qu'elle s'exécute avec des privilèges de niveau utilisateur, mais que votre application cible s'exécute avec une autorisation de niveau administrateur (élevé), vous ne pourrez pas faire glisser-déposer car ceci est considéré comme un problème de sécurité car la cible est courir avec un niveau de privilèges plus élevé.

75
Tim Lloyd

Il s'appelle UIPI, Isolation des privilèges de l'interface utilisateur. Conçu pour empêcher les exploits d'injection d'entrée provenant de programmes exécutés avec des privilèges restreints. Il peut être désactivé, vous devrez faire ceci:

  • Modifiez le manifeste, définissez l'attribut uiAccess pour l'élément <requestedExecutionLevel> sur true.
  • Stockez le fichier EXE de votre programme dans un sous-répertoire de c:\windows ou c:\program files
  • Signer votre fichier EXE avec un certificat d'une autorité de signature de code valide

Jamais vraiment essayé cela, ymmv.

17
Hans Passant

Depuis votre application, appelez ChangeWindowMessageFilter avec les valeurs suivantes pour permettre le glisser-déposer de/vers votre application élevée et les applications non élevées comme Explorer:

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);
1
dmex

Cela n’est peut-être pas lié, mais j’avais des problèmes whacky Drag-n-Drop avec Windows 8. Cela fonctionnerait pendant un moment, puis cesserait de fonctionner. Je ne pouvais pas glisser-déposer entre l'explorateur, un éditeur, etc. Il s'est avéré que lorsque j'interagissais avec un ordinateur Hyper-V VM sous Windows 7, ma capacité de glisser-déposer était altérée c’était peut-être la frappe sur les touches ctrl-alt-end pour simuler crtl-alt-delete en Hyper-V). En tout état de cause, l'un des problèmes rencontrés a été résolu comme suit:

J'ai trouvé la solution à mon problème ici: La fonctionnalité de glisser-déposer ne fonctionnait pas sous Windows 7 Vista XP

Fondamentalement, la solution était:

Cliquez avec le bouton gauche de la souris sur un fichier dans l'Explorateur et, tout en maintenant le bouton de la souris enfoncé, appuyez sur [Esc], puis sur [Ctrl], puis relâchez le bouton de la souris. Je dois supposer que cela réinitialise certains paramètres d'accessibilité ou quelque chose du genre.

1
Metro

Un ajout mineur au post de dmex. Ce qui suit définit les variables et la constante. 

private const uint WM_DROPFILES = 0x233;
private const uint WM_COPYDATA = 0x004A;
private const uint WM_COPYGLOBALDATA = 0x0049;
private const uint MSGFLT_ADD = 1;

Vous pouvez également envisager d'utiliser ChangeWindowMessageFilterEx si votre application est sous Windows 7. Je pense également que le glisser-déposer de OLE peut ne pas utiliser la messagerie Windows. Donc, cela n’aurait aucun effet. 

1
BlndLeadingDef

J'ai eu le même problème lors du débogage d'une application de bureau C # sous VS 2015 et Windows 7 x64 en tant que SO C'était dû à l'autorisation administrator appliquée sur le raccourci de mon VS IDE sur le bureau (voir capture d'écran). Décocher cette option Les événements de glisser-déposer sont générés correctement.

Merci à TimLloyd pour son aide.

 enter image description here

0
mggSoft