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.
könnten Sie Ihren Code für die Behandlung von NCCALCSIZE posten? –
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. –
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 –