2010-05-27 12 views
7

Ho un problema con Aero Snap che non funziona con l'applicazione su cui sto lavorando (desktop Windows, applicazione C++ nativa) e sono un po 'confuso su cosa sta succedendo, poiché sembra che dovrebbe funzionare, appena fuori dalla scatola.Aero Snap non funziona per la mia applicazione

ho usato Spy ++ in un'applicazione Win32 mininal, e ottenere i seguenti messaggi quando si preme Win-sinistra:

< 00070> 00030D1C P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 Scancode: 5B fRepeat: 0 FUP : 0 < 00071> 00030D1C P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 scancode: 5B fRepeat: 1 FUP: 0 < 00072> 00030D1C P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 scancode: 5B fRepeat: 1 FUP: 0 < 00088> 00030D1C S WM_GETMINMAXINFO lpmmi: 0043FCBC
< 00089> 00030D1C R WM_GETMINMAXINFO lpmmi: 0043FCBC
< 00090> 00030D1C S WM_WINDOWPOSCHANGING lpwp: 0043FCC4
< 00091> 00030D1C S WM_GETMINMAXINFO lpmmi: 0043F8E8
< 00092> 00030D1C R WM_GETMINMAXINFO lpmmi: 0043F8E8
< 00093> 00030D1C R WM_WINDOWPOSCHANGING
.. e così via

Quindi posso vedere che il WM_KEYDOWN per la chiave di sinistra non sta raggiungendo l'applicazione, ma sto ricevendo invece la finestra "ridimensiona finestra" di snap aereo.

Quando I Spy ++ la mia applicazione, posso vedere che il tasto sinistro non viene "intercettato", ma invece viene passato all'applicazione, quindi non ottengo alcun bontà.

< 00043> 000F0F12 P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 Scancode: 5B fRepeat: 0 FUP: 0
< 00044> 000F0F12 P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 Scancode: 5B fRepeat: 1 FUP: 0
< 00045> 000F0F12 P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 scancode: 5B fRepeat: 1 FUP: 0
< 00060> 000F0F12 P WM_KEYUP nVirtKey: VK_LEFT cRepeat: 1 scancode: 4B fRepeat: 0 FUP: 1

I sto andando a scavare nel nucleo del nostro messaggio di gestione e vedere cosa sta succedendo, ma prenderò tutto il trucco s posso ottenere :)

Edit ho notato che Win-up e Win-Shift-sinistra/destra in realtà funzionano correttamente, quindi è solo Win-Down e Win-sinistra/destra che non vengono "aero scattato "nella posizione/dimensione corretta.

Modifica Ok, il problema sembra essere che la mia finestra non è stata creata con il flag WS_THICKFRAME. Se aggiungo la bandiera, lo snap funziona. Ora, in realtà non voglio il confine lì, ma almeno so che cosa stava causando il comportamento strano ..

Si spera che una modifica finale Liberarsi del confine è stato semplice come rispondere a WM_NCCALCSIZE e facendo in modo che il client occupi l'intera finestra.

+0

potresti pubblicare il tuo codice per la gestione di NCCALCSIZE? –

+2

Il codice era semplice come restituire 0 dal gestore messaggi. Vedere la documentazione MSDN per WM_NCCALCSIZE per una descrizione dettagliata di ciò che sta realmente accadendo, ma in breve, quando NCCALCSIZE viene chiamato, lParam contiene un puntatore a un array di 3 rettangoli, dove il primo è la finestra rect. Quando ritorni da NCCALCSIZE, Windows si aspetta che il primo rettangolo sia il tuo cliente rect, quindi semplicemente non facendo nulla, hai reso il client rect uguale al rect della finestra. –

+0

La mia situazione è per una finestra ingrandita. Quindi ho attivato WS_THICKFRAME, ho disattivato WS_CAPTION (perché sto disegnando il mio) e restituisco 0 per WM_NCCALCSIZE nel mio windowproc, ma continuo a vedere il bordo. : p –

risposta

4

Non riesco a ricordare i messaggi specifici, ma Aero Snap è disabilitato se si elaborano i messaggi WM_MOVING/WM_MOVE e/o WM_SIZING/WM_SIZE per la finestra principale. Se questi non raggiungono lo DefWindowProc Aero Snap non funzionerà.Immagino che DefWindowProc sia responsabile dell'implementazione di Aero Snap, quindi se ci si assicura che quei messaggi lo raggiungano, ciò potrebbe aiutare.

Ho scoperto questo codice di trascinamento della finestra personalizzato di implementazione in modo che l'applicazione continui a eseguire e aggiornare lo schermo mentre la finestra viene trascinata, il che significava l'elaborazione di questi messaggi, ma ha disattivato Aero Snap.

Modifica: Su ulteriore ispezione, l'applicazione menzionata gestisce WM_SYSCOMMAND e controlla (wParam & 0xFFF0) == SC_MOVE per indicare l'inizio di una finestra. Restituisce quindi 0 e simula il trascinamento della finestra aggiornando periodicamente la posizione della finestra mentre esegue ancora l'applicazione, il disegno ecc. Ciò fa sì che Windows ritenga che la finestra non sia mobile e che l'utente non possa trascinarla, ma la mia applicazione sta aggiornando la posizione per fare sembra che sia ancora trascinato fino a WM_LBUTTONUP. Ovviamente Windows non proverà alcun materiale Aero Snap se non pensa che la finestra venga trascinata. Forse la tua applicazione fa qualcosa di simile (se qualcuno ha un modo migliore per mantenere l'applicazione in esecuzione durante un trascinamento, sarei interessato a sentire).

2

Dubito che sia la gestione dei messaggi, il ciclo di messaggi non vede mai il messaggio WM_KEYDOWN. Dopo aver provato varie cose senza successo, posso solo immaginare a Windows che la tua app sia incompatibile in qualche modo. Ad esempio, utilizzando SetWindowsHookEx() nel programma.

Problemi correlati