Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 为什么处理WM_NCCALCSIZE会导致我的窗口跳转?_Wpf_Windows_Winapi_Pinvoke - Fatal编程技术网

Wpf 为什么处理WM_NCCALCSIZE会导致我的窗口跳转?

Wpf 为什么处理WM_NCCALCSIZE会导致我的窗口跳转?,wpf,windows,winapi,pinvoke,Wpf,Windows,Winapi,Pinvoke,我有一个WPF应用程序可以捕捉到屏幕边缘(如果你在屏幕边缘的20像素范围内,我只设置窗口的.Top或.Left),但是我最近添加了一些代码来“弄乱”窗口的chrome,尽管它工作得很好(),但它会导致“snapto”意外地移动窗口(例如:当它应该直接向下弹到底部时,它会跳到左边) 我把范围缩小到他们对WM_NCCALCSIZE的处理……这真的很奇怪,因为他们基本上什么都不做,他们只是说他们处理了,然后返回0 根据WM_NCCALCSIZE的文档,这只会导致整个窗口被视为客户机(没有非客户机边缘)

我有一个WPF应用程序可以捕捉到屏幕边缘(如果你在屏幕边缘的20像素范围内,我只设置窗口的.Top或.Left),但是我最近添加了一些代码来“弄乱”窗口的chrome,尽管它工作得很好(),但它会导致“snapto”意外地移动窗口(例如:当它应该直接向下弹到底部时,它会跳到左边)

我把范围缩小到他们对WM_NCCALCSIZE的处理……这真的很奇怪,因为他们基本上什么都不做,他们只是说他们处理了,然后返回0

根据WM_NCCALCSIZE的文档,这只会导致整个窗口被视为客户机(没有非客户机边缘),但不知何故,这也意味着每当我的snap-to代码将窗口向下移动到屏幕底部时,它也会向左移动约134像素…(移动到其他边缘会产生类似的副作用)只要我按住鼠标拖动它,它就会从它应该在的位置来回闪烁。如果我对WM_NCCALCSIZE处理进行注释,快照就会按它应该的方式工作(但表单看起来不正确)

我已经在WM\u NCCALCSIZE处理程序中尝试了所有我能做的事情,但我无法阻止它向左跳…当然,WM\u NCCALCSIZE只在窗口大小改变时才会被调用,所以我不明白它是如何导致这一点的


另外,如果您想实际查看代码,它已经在两个文件中查找并

wParam似乎总是正确的(1),lParam是一个NCCALCSIZE_参数

其目的是完全按照您所说的做:强制整个窗口成为“客户端”,然后使用Vista DWM API将框架扩展到客户端区域。我不明白为什么它会向左移动这么远


如果我跟踪或中断handlenCalcSize方法,当我调整窗口大小时(当它位于边缘以便触发捕捉时),NCCalcSize会被调用两次:一次调用它应该在的位置,然后向左调用它结束的位置。

发生这种情况的原因是处理
WM\u NCCalcSize
会更改窗口的整体大小……但是如果您移动窗口,则会在
WM\u MOVE
WM\u WINDOWPOSCHANGED
(对应于WPF
WindowPositionChanged
事件)导致另一条
WM\u NCCALCSIZE
消息

WM\u NCCALCSIZE
期间进行更改(即使只是声明您处理了消息)会导致另一次调用
WM\u MOVE
…这将使您进入一个循环,其中positionchanged消息的“FROM”部分保持不变(使窗口“跳跃”)从它开始的位置到您在
WM\u移动期间调整它的位置
WM\u NCCALCSIZE
之后,随着它的变化而反复调整

正确的方法
您需要做的是遵守Raymond Chen和。它发生在这些其他消息之前,这样它们就不会相互干扰!

当WM\u NCCALCSIZE处理程序返回0时,wParam和lParam是什么?文档中说“如果wParam为TRUE且应用程序返回零,则保留旧客户端区域并与新客户端区域的左上角对齐“这听起来像是发生在你身上的事情。我从来没有弄明白这一点,但我确实确定,如果我们在WM_WindowPosChanged消息而不是WPF WindowPositionChanged事件期间调整窗口位置,问题就会消失。因此,找到了解决方法。在生活中继续前进。