2010-05-14 18 views
42

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.C# Arrastrar gota no funciona en Windows 7

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 programa se ejecuta con administritave priviliges.

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

+0

tuve un problema algo similar con un nuevo proyecto de Silverlight. La función de arrastrar y soltar no funcionó debido a las funciones de seguridad de mi navegador. ¿Estás usando un control de navegador en tus winforms? – Tim

+2

Me he dado cuenta de que cuando se ejecutan aplicaciones con permisos elevados en Windows 7, arrastrar y soltar queda deshabilitado. – sshow

Respuesta

70

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 &, ya que esto se considera un problema de seguridad como el objetivo se ejecuta con un mayor nivel de privilegios.

+0

Eso parece correcto. Intenté ejecutar IE con privilegios administrativos y arrastrándome desde IE y funcionó. Tiene sentido también, sin importar lo molesto que sea –

+4

, debe motivarlo para cambiar lo que necesita cambiar para que su aplicación pueda ejecutarse como usuario estándar. Por ejemplo, no escribas en los archivos del programa, en HKLM, etc. –

+0

@Kate El motivo para correr con derechos elevados es que necesito iniciar y detener los servicios :) –

16

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

  • Modificar el manifiesto, establezca el atributo uiAccess para el elemento <requestedExecutionLevel> true.
  • tienda EXE de su programa en un subdirectorio del directorio c: \ windows oc: \ Archivos de programa
  • Firme su EXE con un certificado de un código válido firma de la autoridad

En realidad nunca intentado esto, tu caso es distinto.

+1

+1 Nice answer :) Gracias por aclarar cómo resolverlo. No vale la pena para mí, sin embargo :) –

2

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

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

Arrastrar + soltar ya no utiliza mensajes de la ventana, ChangeWindowMessageFilter no funciona. –

+1

@HansPassant ¿Podría proporcionarnos algunos detalles, por favor? – ken2k

+0

@ ken2k - no hay mucho que decir mucho más allá de esto. D + D ahora se implementa en COM, IDropSource e IDropTarget son las interfaces principales. –

1

una pequeña adición al post 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 estás aplicación es en Windows 7. También creo que arrastrar y colocar de OLE no pueden utilizar la mensajería de Windows. Entonces no afectaría eso en absoluto.

1

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, se produjo un solo tema, la siguiente resolvió:

He encontrado la solución a mi problema aquí: Fix Drag Drop Functionality Not Working In Windows 7 Vista XP

Básicamente la solución fue:

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í.

0

Tuve el mismo problema al depurar una aplicación de escritorio C# de VS 2015 y Windows 7 x64 como S.O. Fue debido al permiso de administrador aplicado sobre el acceso directo de mi VS IDE en el escritorio (consulte la captura de pantalla). Desmarcando esta opción Arrastre & Los eventos de colocación se levantan correctamente.

Gracias a TimLloyd por su ayuda.

enter image description here

Cuestiones relacionadas