2010-05-14 13 views
42

J'ai eu un projet pendant un certain temps 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, lorsque vous utilisez Windows 7, cela ne fonctionne pas. L'événement ne se déclenche même pas.C# Le glisser-déposer ne fonctionne pas sous Windows 7

AllowDrop est défini sur true. En s'abonnant à DragEnter il n'est pas appelé dans Windows 7 (pas sûr de vista). Mais sur XP cela fonctionne tout le chemin. Le programme est exécuté avec des privilèges adminitave.

Y a-t-il une différence dans la baisse de traînée dans Windows 7 vs XP? Je ne sais pas si c'est pertinent, mais j'utilise x64

+0

J'ai eu un problème assez similaire avec un nouveau projet Silverlight. Le glisser-déposer n'a pas fonctionné, à cause des fonctions de sécurité de mon navigateur. Utilisez-vous un contrôle de navigateur dans vos winforms? – Tim

+2

J'ai remarqué que lors de l'exécution d'applications avec des autorisations élevées dans Windows 7, le glisser-déposer est désactivé. – sshow

Répondre

70

Les processus source et cible doivent avoir des niveaux de sécurité compatibles \ privileges. Par exemple, si votre source est Explorer et qu'elle est exécutée avec des privilèges de niveau utilisateur, mais que votre application cible est dotée d'une autorisation de niveau administrateur (élevée), vous ne pourrez pas faire glisser & car cela est considéré comme un problème de sécurité. La cible fonctionne avec un niveau de privilèges plus élevé.

+0

Cela semble correct. J'ai essayé de courir l'IE avec des privilèges administratifs et le dragdropping d'IE et cela a fonctionné. Fait aussi du sens, mais ennuyeux –

+4

Devrait fournir la motivation pour changer ce que vous devez changer afin que votre application peut fonctionner en tant qu'utilisateur standard. Par exemple, n'écrivez pas dans les fichiers de programme, dans HKLM etc. –

+0

@Kate La raison de l'exécution avec des droits élevés est que j'ai besoin de démarrer et d'arrêter les services :) –

16

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

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

jamais vraiment essayé, YMMV.

+1

+1 Bonne réponse :) Merci de nous avoir expliqué comment le résoudre. Cela ne vaut pas la peine pour moi cependant :) –

2

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

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD); 
ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD); 
ChangeWindowMessageFilter (0x0049, MSGFLT_ADD); 
+3

Glisser-déposer n'utilise plus les messages Windows, ChangeWindowMessageFilter ne fonctionne pas. –

+1

@HansPassant Pourriez-vous fournir quelques détails s'il vous plaît? – ken2k

+0

@ ken2k - il n'y a pas grand chose à dire au-delà de cela. D + D est maintenant implémenté dans COM, IDropSource et IDropTarget sont les interfaces de base. –

1

Un ajout mineur au poste 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; 

En outre, vous voudrez peut-être envisager d'utiliser ChangeWindowMessageFilterEx si vous êtes application est sur Windows 7. Je crois aussi que le glisser-déposer OLE ne peuvent pas utiliser la messagerie de Windows. Cela n'aurait donc aucun effet.

1

Il peut être sans rapport, mais j'avais des problèmes de Drag-n-Drop avec Windows 8. Cela fonctionnerait pendant un certain temps et ensuite cesser de fonctionner. Je ne pouvais pas faire de glisser-déposer entre Explorer, dans un éditeur, etc. Il s'avère que lorsque j'ai interagi avec une machine virtuelle Hyper-V fonctionnant sous Windows 7, ma capacité de drag-n-drop a été modifiée (ou peut-être touche ctrl-alt-end pour simuler crtl-alt-delete en Hyper-V). En tout état de cause, on la question a eu lieu, ce qui suit a résolu:

Je trouve la résolution de mon problème ici: Fix Drag Drop Functionality Not Working In Windows 7 Vista XP

Fondamentalement, la solution était:

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

0

J'ai rencontré le même problème lors du débogage d'une application C# de bureau de VS 2015 et Windows 7 x64 en tant que S.O. Il était dû à l'autorisation administrateur appliquée sur le raccourci de mon IDE VS sur le bureau (voir capture d'écran). Décocher cette option Glisser & Les événements de dépôt augmentent correctement.

Merci à TimLloyd pour son aide.

enter image description here

Questions connexes