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

时间:2010-05-27 10:55:46

标签: c++ winapi windows-7 aero 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 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
..等等

所以我可以看到左键的WM_KEYDOWN没有到达应用程序,但我正在获取aero snap“resize window”的内容。

当我使用Spy ++我的应用程序时,我可以看到左键没有被“拦截”,而是被传递给应用程序,所以我没有得到任何攫取的好处。

< 00043> 000F0F12 P WM_KEYDOWN nVirtKey:VK_LWIN c重复:1 ScanCode:5B fRepeat:0 fUp:0
< 00044> 000F0F12 P WM_KEYDOWN nVirtKey:VK_LWIN c重复:1 ScanCode:5B f重复:1 fUp:0
< 00045> 000F0F12 P WM_KEYDOWN nVirtKey:VK_LWIN c重复:1 ScanCode:5B f重复: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一样简单,并使客户端占据整个窗口。

2 个答案:

答案 0 :(得分:4)

我无法记住特定消息,但如果您处理主窗口的WM_MOVING / WM_MOVE和/或WM_SIZING / WM_SIZE消息,则会禁用Aero Snap。如果这些未达到DefWindowProc Aero Snap将无效。我想DefWindowProc负责实施Aero Snap,所以如果你确保这些消息到达它,那可能会有所帮助。

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

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

答案 1 :(得分:2)

我怀疑它是消息处理,消息循环永远不会看到WM_KEYDOWN消息。在尝试了各种不成功的事情之后,我只能猜测Windows认为你的应用程序是不兼容的。例如,在程序中使用SetWindowsHookEx()。