Aero Snap不适用于我的应用程序

Mag*_*ind 7 c++ winapi aero windows-7 aero-snap

我有一个问题,Aero Snap没有使用我正在处理的应用程序(Windows桌面,本机C++应用程序),我对发生的事情感到有点困惑,因为它看起来应该只是起作用,框.

我在mininal win32应用程序上使用了Spy ++,并在按下Win-Left时收到以下消息:

<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 c重复:1 ScanCode:5B f重复: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
..等等

所以我可以看到左键的WM_KEYDOWN没有到达应用程序,但我得到了aero snap"resize window"的东西.

当我Spy ++我的应用程序时,我可以看到左键没有被"拦截",而是被传递给应用程序,所以我没有得到任何抢购的善.

<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

我将深入研究我们的消息处理的核心,看看发生了什么,但我将采取所有我可以得到的提示:)

编辑我注意到Win-Up和Win-Shift-Left/Right实际上工作正常,所以它只是Win-Down和Win-Left/Right而不是"aero snapped"到正确的位置/大小.

编辑确定,问题似乎是我的窗口没有使用WS_THICKFRAME标志创建.如果我添加标志,快照工作.现在,我实际上并不首先想要那里的边界,但至少我知道造成这种奇怪行为的原因.

希望最终编辑摆脱边界就像响应WM_NCCALCSIZE一样简单,并使客户端占据整个窗口.

Ash*_*ain 5

我不记得具体的消息,但是如果您处理主窗口的 WM_MOVING/WM_MOVE 和/或 WM_SIZE/WM_SIZE 消息,则 Aero Snap 将被禁用。如果这些没有到达DefWindowProcAero Snap 将无法工作。我猜 DefWindowProc 负责实现 Aero Snap,所以如果你确保这些消息到达它,那可能会有所帮助。

我发现这是实现自定义窗口拖动代码,因此应用程序在拖动窗口时继续执行和更新屏幕,这意味着处理这些消息,但它禁用了 Aero Snap。

编辑:进一步检查,我提到的应用程序处理 WM_SYSCOMMAND 并检查(wParam & 0xFFF0) == SC_MOVE以指示窗口移动开始。然后它返回 0 并通过在仍在运行应用程序、绘图等的同时定期更新窗口位置来模拟窗口拖动。这导致 Windows 认为窗口不可移动并且用户无法拖动它,但我的应用程序正在更新位置以制作看起来它仍在被拖动,直到 WM_LBUTTONUP。显然,如果 Windows 认为窗口没有被拖动,它不会尝试任何 Aero Snap 东西。也许您的应用程序做了类似的事情(如果有人有更好的方法在拖动期间保持应用程序运行,我很想听听)。