我在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”的内容.
当我窥探我的应用程序时,我可以看到左键没有被“截获”,而是被传递给应用程序,所以我没有得到任何抢购的善意.
< 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一样简单,并使客户端占据整个窗口.
解决方法
我发现这实现了自定义窗口拖动代码,因此应用程序继续执行并在拖动窗口时更新屏幕,这意味着处理这些消息,但它禁用了Aero Snap.
编辑:进一步检查时,我提到的应用程序处理WM_SYSCOMMAND并检查(wParam& 0xFFF0)== SC_MOVE以指示窗口移动开始.然后返回0并通过在运行应用程序,绘图等时定期更新窗口位置来模拟窗口拖动.这会导致Windows认为窗口不可移动且用户无法拖动它,但我的应用程序正在更新位置看起来它仍然被拖动,直到WM_LBUTTONUP.显然,如果不认为窗口被拖动,Windows将不会尝试任何Aero Snap.也许你的应用程序做了类似的事情(如果有人有更好的方法来保持应用程序在拖动期间运行,我有兴趣听到).