2009-08-25 16 views
6

Tengo problemas para conectar un sistema global al trabajo. Quiero recibir notificaciones cada vez que se mueve una ventana, tan pronto como sea posible, y cambiar el tamaño de la ventana. Esto significa que el gancho CBT HCBT_MOVESIZE no lo cortará, solo ocurre después de que se haya movido la ventana. Quiero enganchar el movimiento real de la ventana y poder cambiar el tamaño de la ventana durante el movimiento.Movimiento de ventana de interceptación global

Los ganchos se establecen desde una DLL, y la función de devolución de llamada se encuentra dentro de esa DLL. Esto es lo que he intentado.

  • WH_CALLWNDPROC. Me avisa cuando se mueve una ventana (WM_MOVING se recibe para Windows desde otras aplicaciones), pero no puedo cambiar el contenido del mensaje.
  • WH_CALLWNDPROCRET Igual que WH_CALLWNDPROC.
  • gancho CBT HCBT_MOVESIZE. El evento sucede hasta tarde.
  • WH_GETMESSAGE. Nunca reciba WM_MOVE, WM_MOVING o WM_WINDOWPOSCHANGING. Este gancho me permitiría cambiar los mensajes.

actualización: ganchos de eventos de Windows parecen permitir que capture que:

hWinEventHook = SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART,  
    EVENT_SYSTEM_MOVESIZEEND, NULL, WinEventProc, 
    0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 

Sin embargo, esto crea un problema diferente: cambiar el tamaño de la ventana usando SetWindowPos() no funciona (que cambia tamaño correcto, pero inmediatamente vuelve a su tamaño anterior), aunque uso SWP_NOSENDCHANGING. Ideas?

Actualización 2: Subclases parece funcionar, sin embargo, Visual Studio se bloquea después de cada ejecución del programa (al igual que muchas otras ventanas). Funciona bien si coloco puntos de interrupción y paso por "unsubclassing", pero no cuando dejo que el programa se ejecute solo. Ideas?

I tienen un gancho CBT (que estaba allí desde antes), y siempre que HCBT_ACTIVATE se envía para una nueva ventana, I eliminar cualquier subclases anterior utilizando SetWindowLongPtr() (esto tiene que funcionar en 64 bits, así), y luego subclase la nueva ventana. Si pongo un punto de interrupción en cualquier parte, e inmediatamente reanudo la sesión cuando se rompe, todo funciona bien. Sin embargo, cuando no tengo ningún punto de interrupción, Visual Studio falla cuando sale el programa.

Respuesta

1

Hm, yo hubiera pensado que HCBT_MOVESIZE es precisamente lo que quiere, dado que el MSDN dice lo siguiente acerca de TCC ganchos:

The system calls this function before activating, creating, destroying, 
minimizing, maximizing, moving, or sizing a window.

y, en particular:

HCBT_MOVESIZE 
    A window is about to be moved or sized.

(estas citas fueron tomadas de http://msdn.microsoft.com/en-us/library/ms644977%28VS.85%29.aspx)

... así que pensé que usted recibiría la llamada HCBT_MOVESIZE a tiempo. La función de enlace que maneja HCBT_MOVESIZE también puede devolver un número entero para que el sistema pueda determinar si la operación está permitida o si debe evitarse. Por lo tanto, dado que el gancho HCBT_MOVESIZE debería tener una opción para evitar la operación, diría que se llamó antes de que ocurriera el movimiento.

¿Está realmente seguro de que la función de enlace se llama después de el evento move?Si realiza una llamada a GetWindowRect en el identificador particular dentro de su función de enlace, ¿el rect devuelto es igual al rectángulo que se pasa a la función de enlace?

+0

Lo que sucede con 'HCBT_MOVESIZE' es que el usuario puede comenzar a arrastrar la ventana, seguir arrastrándola, y la notificación no llega antes de que se le pase la ventana. Aún así, obtienes la notificación antes de que la ventana se mueva técnicamente, pero sigue siendo bastante inútil. –

1

Los ganchos son bastante pesados. Solo quiere usarlos cuando sea absolutamente necesario.

Dicho esto, podría utilizar uno de los ganchos básicos simplemente como una forma de entrar en el proceso. Una vez en el proceso, puede crear una subclase de la ventana que le interesa y manejar los mensajes de tamaño en su procuración de subclase en lugar de intentar capturar todo en el nivel de enlace.

Dependiendo de lo que desee hacer en respuesta al cambio de tamaño, es posible que necesite alguna comunicación entre procesos.

+0

Subclases parece ser el camino a seguir aquí. Sin embargo, Visual Studio se cuelga todo el tiempo cuando no estoy avanzando en la eliminación real de las subclases. –

Cuestiones relacionadas