Ho problemi a far funzionare un hook di sistema globale. Voglio essere avvisato ogni volta che una finestra si muove, il prima possibile, e cambiare le dimensioni della finestra. Ciò significa che il gancio CBT HCBT_MOVESIZE
non lo taglierà, succede solo dopo che la finestra è stata spostata. Voglio agganciare il movimento effettivo della finestra e poter modificare le dimensioni della finestra durante lo spostamento.Intercettazione globale movimento finestra
Gli hook sono impostati da una DLL e la funzione di callback si trova all'interno di tale DLL. Questo è quello che ho provato.
WH_CALLWNDPROC
. Mi avvisa quando viene spostata una finestra (WM_MOVING
viene ricevuta per Windows da altre applicazioni), ma non posso modificare il contenuto del messaggio.WH_CALLWNDPROCRET
Uguale aWH_CALLWNDPROC
.- gancio CBT
HCBT_MOVESIZE
. L'evento accade fino a tardi. WH_GETMESSAGE
. Mai ricevereWM_MOVE
,WM_MOVING
oWM_WINDOWPOSCHANGING
. Questo hook mi permetterebbe di cambiare i messaggi.
Aggiornamento: ganci eventi di Windows sembrano consentire me per catturarlo:
hWinEventHook = SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART,
EVENT_SYSTEM_MOVESIZEEND, NULL, WinEventProc,
0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
Tuttavia, questo crea un problema diverso: la modifica della dimensione della finestra utilizzando SetWindowPos()
non funziona (cambia dimensione va bene, ma torna immediatamente alla sua dimensione precedente), anche se io uso SWP_NOSENDCHANGING
. Idee?
Aggiornamento 2: la sottoclasse sembra funzionare, tuttavia Visual Studio si arresta in modo anomalo dopo l'esecuzione di ciascun programma (analogamente a molte altre finestre). Funziona bene se metto dei punti di interruzione e percorro il "disassociato", ma non quando lascio girare il programma da solo. Idee?
Ho un gancio CBT (che c'era da prima), e quando HCBT_ACTIVATE
viene inviato per una nuova finestra, rimuovere eventuali sottoclassi precedente mediante SetWindowLongPtr()
(questo deve funzionare su 64 bit pure), e quindi sottoclasse la nuova finestra Se metto un breakpoint ovunque e riprendo immediatamente la sessione quando si rompe, tutto funziona correttamente. Tuttavia, quando non ho alcun punto di interruzione, Visual Studio si arresta in modo anomalo quando il programma viene chiuso.
Cosa succede con "HCBT_MOVESIZE' è che l'utente può iniziare a trascinare la finestra, continuare a trascinarla e la notifica non arriva prima che lasci andare la finestra. Tuttavia, ricevi la notifica prima che la finestra venga spostata tecnicamente, ma è comunque abbastanza inutile. –