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 queWH_CALLWNDPROC
.- gancho CBT
HCBT_MOVESIZE
. El evento sucede hasta tarde. WH_GETMESSAGE
. Nunca recibaWM_MOVE
,WM_MOVING
oWM_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.
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. –