C # Drag drop no funciona en Windows 7

He tenido un proyecto durante bastante tiempo usando C # winforms. Implementé una función de arrastrar y colocar antes de que se lanzara Windows 7. Trabajado como un encanto. Sin embargo, al usar Windows 7, no funciona. El evento ni siquiera se dispara.

AllowDrop está establecido en verdadero. Al suscribirse a DragEnter no se llama en Windows 7 (no estoy seguro de vista). Pero en XP funciona todo el camino. El progtwig se ejecuta con administritave priviliges.

¿Hay alguna diferencia en la caída de drag en windows 7 vs xp? No sé si es relevante, pero estoy usando x64

Los procesos de origen y destino deben tener niveles de seguridad / privilegios compatibles. Por ejemplo, si su fuente es Explorer y se está ejecutando con privilegios de nivel de usuario, pero su aplicación de destino se ejecuta con permiso de administrador (nivel elevado), no podrá arrastrar y soltar ya que esto se considera un problema de seguridad ya que el objective es corriendo con un mayor nivel de privilegios.

Se llama UIPI, Aislamiento de privilegios de interfaz de usuario. Diseñado para evitar ataques de inyección de entrada desde progtwigs que se ejecutan con privilegios restringidos. Se puede deshabilitar, tendrás que hacer esto:

  • Modifique el manifiesto, establezca el atributo uiAccess para el elemento en verdadero.
  • Almacene el EXE de su progtwig en un subdirectorio de archivos c: \ windows o c: \ program
  • Firme su EXE con un certificado de una autoridad de firma de código válida

Nunca he intentado esto, mmm.

Desde su aplicación, llame a ChangeWindowMessageFilter con los siguientes valores para permitir el arrastrar y colocar desde / hacia su aplicación elevada y aplicaciones no elevadas como Explorer:

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

Una adición menor a la publicación de dmex. Lo siguiente define las variables y 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; 

Además, es posible que desee considerar el uso de ChangeWindowMessageFilterEx si su aplicación está en Windows 7. También creo que OLE arrastrar y soltar no puede usar la mensajería de Windows. Entonces no afectaría eso en absoluto.

Puede no estar relacionado, pero estaba teniendo problemas de arrastrar y soltar con Windows 8. Funcionaría por un tiempo y luego dejaría de funcionar. No pude arrastrar y soltar entre Explorer, en un editor, etc. Resultó que cuando interactué con una VM de Hyper-V que ejecutaba Windows 7, mi capacidad de arrastrar y soltar se alteró (o tal vez fue el pulsación de teclas ctrl-alt-end para simular crtl-alt-delete a Hyper-V). En cualquier caso, uno de los problemas ocurrió, lo resolvió a continuación:

Encontré la resolución de mi problema aquí: Arreglo de la funcionalidad de arrastrar y soltar no funciona en Windows 7 Vista XP

Básicamente, la solución fue:

Haga clic izquierdo en un archivo en el explorador, y mientras mantiene presionado el botón del mouse, presione [Esc] y luego [Ctrl], luego suelte el botón del mouse. Tengo que asumir que esto está restableciendo alguna configuración de accesibilidad o algo así.

Tuve el mismo problema al depurar una aplicación de escritorio C # de VS 2015 y Windows 7 x64 como SO Fue debido al permiso de administrador aplicado sobre el acceso directo de mi VS IDE en el escritorio (ver captura de pantalla). Desmarcando esta opción, los eventos de Arrastrar y Soltar se visualizan correctamente.

Gracias a TimLloyd por su ayuda.

enter image description here