c++ - Aero Snap 不适用于我的应用程序

标签 c++ winapi windows-7 aero aero-snap

我遇到 Aero Snap 无法与我正在处理的应用程序(Windows 桌面、 native C++ 应用程序)一起工作的问题,我对发生的事情有点困惑,因为它似乎应该可以正常工作,开箱即用。

我在一个最小的 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 捕捉“调整窗口大小”的东西。

当我 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 没有被“气动折断”到正确的位置/大小。

编辑 好的,问题似乎是我的窗口不是用 WS_THICKFRAME 标志创建的。如果我添加标志,捕捉工作。现在,我实际上一开始并不想要那里的边界,但至少我知道是什么导致了奇怪的行为..

希望是最后的编辑摆脱边框就像响应 WM_NCCALCSIZE 一样简单,并让客户端占据整个窗口。

最佳答案

我不记得具体消息,但如果您处理主窗口的 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 东西。也许您的应用程序会做类似的事情(如果有人有更好的方法让应用程序在拖动过程中保持运行,我很想听听)。

关于c++ - Aero Snap 不适用于我的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2920451/

相关文章:

c - PEB(进程环境 block )无效的 DllBase 地址

windows-7 - 没有/d为什么不能在命令行中启动程序? (Windows 7x64)

ruby-on-rails - vim和cream windows 7访问权限

c++ - WaitForSingleObject 与互锁*

c - SetPixel 随着时间的推移变慢

c++ - JSONCPP 正在向字符串添加额外的双引号

c++ - 如何在 C++ 中计算以 2 为底的对数?

ruby-on-rails-3 - 无法安装 rmagick、ruby 1.9、rails 3、windows

c++ - 为GUI编程实践项目构想?

python - 为子进程提供 CPU 时间和内存