2010-05-27 5 views
7

Ich habe ein Problem mit Aero Snap nicht mit der Anwendung arbeite ich arbeite (Windows-Desktop, native C++ - Anwendung), und ich bin ein bisschen verwirrt, was passiert, wie es scheint, als sollte es einfach funktionieren, out of the box.Aero Snap funktioniert nicht für meine Anwendung

Ich habe verwendet Spy ++ auf einem mininal Win32-Anwendung, und nutzen Sie die folgenden Meldungen, wenn ich drücken Win-Links:

< 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
.. und so weiter

So kann ich sehen, dass das WM_KEYDOWN für den linken Schlüssel nicht die Anwendung erreicht, aber ich bekomme stattdessen die Aero-Snap "Größe Fenster" Zeug.

Wenn ich Spy ++ meine Anwendung, kann ich sehen, dass die linke Taste nicht "abgefangen" wird, sondern stattdessen an die Anwendung weitergegeben wird, so dass ich keine Schnappschüsse güte.

< 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 Ich werde in die Kernbereiche unserer Nachrichtenverarbeitung einsteigen und sehen, was vor sich geht, aber ich werde den ganzen Tipp nehmen s Ich kann bekommen :)

Bearbeiten Ich bemerkte, dass Win-Up und Win-Shift-Left/Right tatsächlich richtig funktionieren, so ist es nur Win-Down und Win-Left/Right, die nicht "aero schnappte "in die richtige Position/Größe.

Bearbeiten Ok, das Problem scheint zu sein, dass mein Fenster nicht mit dem WS_THICKFRAME-Flag erstellt wurde. Wenn ich das Flag hinzufüge, funktioniert das Einrasten. Jetzt möchte ich eigentlich nicht die Grenze dort an erster Stelle, aber zumindest weiß ich, was das seltsame Verhalten verursacht hat.

Hoffentlich eine endgültige Bearbeitung Die Grenze loszuwerden war so einfach wie zu reagieren WM_NCCALCSIZE, und der Client das ganze Fenster besetzen.

+0

könnten Sie Ihren Code für die Behandlung von NCCALCSIZE posten? –

+2

Der Code war so einfach wie die Rückgabe von 0 aus dem Message-Handler. Eine detaillierte Beschreibung dessen, was wirklich passiert, finden Sie in der MSDN-Dokumentation für WM_NCCALCSIZE. Kurz gesagt, wenn NCCALCSIZE aufgerufen wird, hält lParam einen Zeiger auf ein Array von 3 Rechtecken, wobei das erste das Fenster rect ist. Wenn Sie von NCCALCSIZE zurückkehren, erwartet Windows, dass das erste Rechteck Ihr Client-Rect ist. Wenn Sie also einfach nichts tun, haben Sie den Client rect gleich dem Fenster rect gemacht. –

+0

Meine Situation ist für ein maximiertes Fenster. Also habe ich WS_THICKFRAME eingeschaltet, ich habe WS_CAPTION deaktiviert (weil ich meine eigene zeichne), und ich gebe 0 für WM_NCCALCSIZE in meinem windowproc zurück, aber ich sehe immer noch den Rahmen. : p –

Antwort

4

Ich kann mich nicht an die spezifischen Nachrichten erinnern, aber Aero Snap ist deaktiviert, wenn Sie die Meldungen WM_MOVING/WM_MOVE und/oder WM_SIZING/WM_SIZE für das Hauptfenster verarbeiten. Wenn diese nicht DefWindowProc erreichen, wird Aero Snap nicht funktionieren.Ich nehme an, dass DefWindowProc für die Implementierung von Aero Snap verantwortlich ist. Wenn Sie also sicherstellen, dass diese Nachrichten es erreichen, könnte das hilfreich sein.

Ich entdeckte diese Implementierung benutzerdefinierte Fenster ziehen Code, so dass die Anwendung weiterhin ausgeführt wird und aktualisieren Sie den Bildschirm, während das Fenster gezogen wird, was bedeutete, diese Meldungen verarbeitet, aber Aero Snap deaktiviert.

Edit: Bei einer weiteren Inspektion, die Anwendung, die ich erwähnte Griffe WM_SYSCOMMAND und prüft (wParam & 0xFFF0) == SC_MOVE ein Fenster bewegen, um anzuzeigen, beginnen. Sie gibt dann 0 zurück und simuliert das Fensterziehen, indem die Fensterposition periodisch aktualisiert wird, während die Anwendung, Zeichnung usw. weiter ausgeführt wird. Dies lässt Windows glauben, dass das Fenster nicht verschiebbar ist und dass der Benutzer es nicht ziehen kann, aber meine Anwendung aktualisiert die Position Es sieht so aus, als ob es immer noch gezogen wird, bis WM_LBUTTONUP. Offensichtlich wird Windows keine Aero Snap-Sachen ausprobieren, wenn das Fenster nicht gezogen wird. Vielleicht macht Ihre Anwendung etwas Ähnliches (wenn jemand einen besseren Weg hat, die App während eines Ziehens laufen zu lassen, würde mich das interessieren).

2

Ich bezweifle, es ist die Nachrichtenbehandlung, die Nachrichtenschleife sieht nie die WM_KEYDOWN Nachricht. Nachdem ich verschiedene Dinge erfolglos ausprobiert habe, kann ich nur vermuten, dass Windows denkt, dass Ihre App irgendwie inkompatibel ist. Verwenden Sie beispielsweise SetWindowsHookEx() in Ihrem Programm.

Verwandte Themen