我有一个WPF应用程序捕捉屏幕边缘(我只是设置窗口的顶部或左侧,如果你在20像素的屏幕边缘),但我最近添加了一些由WPF SDK团队提供的代码“与窗口铬“混乱”,虽然它的工作很好( 截图 ),这是导致“突然移动”窗口意外移动(例如:它跳到左侧,当它应该直接向下跳到底部)
我已经缩小到他们处理WM_NCCALCSIZE …这真的很奇怪,因为他们基本上什么都不做,他们只是说他们处理它,并返回0。
根据WM_NCCALCSIZE文档,这应该只是导致整个窗口被视为客户端(没有非客户端边缘),但不知何故,这也意味着,只要我的pipe理代码将窗口向下移动到屏幕的底部,它也左移约134像素…(移动到其他边缘有类似的副作用),只要我拿着鼠标拖动它,从它应该是来回地闪烁。 如果我将WM_NCCALCSIZE处理注释掉,那么pipe理单元的工作方式应该是这样的(但表单看起来不正确)。
我已经试过WM_NCCALCSIZE处理程序中的所有东西,但是我无法阻止它向左跳跃…当然,WM_NCCALCSIZE只在窗口大小发生变化时被调用,所以我不明白它是如何引起的这首先!
如何在安装gem时包含x86-mingw32二进制文件
PyInstaller – 程序在另一台计算机上返回-1
如何在Windows Vista / 7/8上以编程方式启动SFC?
我可以在哪里放置文件,使其可以由非pipe理员编辑并由所有用户访问?
无法在Windows Server 2012上卸载ASP.NET
PS如果您想实际看到代码,它已经在CodePlex上 ,在两个文件中查找_HandleNCCalcSize和OnWindowLocationChanged
C diceroll游戏
C ++ – WinAPI获取所有连接的USB设备列表
如何使用docker组装卷来装载windows文件夹?
使非客户区域失效
发生这种情况的原因是处理WM_NCCALCSIZE更改窗口的整体大小…但如果您要移动窗口,在WM_MOVE或WM_WINDOWPOSCHANGED (对应于WPF WindowPositionChanged事件)期间更改您的位置会导致另一个WM_NCCALCSIZE消息.. 。
在WM_NCCALCSIZE期间进行WM_NCCALCSIZE (即使只是断言你处理了该消息)会导致对WM_MOVE另一个调用,这会将你置于一个循环中,positionchanged消息的“FROM”部分保持不变(使窗口从“跳转”它开始调整WM_MOVE期间的位置,因为它在WM_NCCALCSIZE之后变回)。
正确的方法
你所要做的就是服从Raymond Chen, 而不是处理WM_WINDOWPOSCHANGING 。 它发生在这些其他的消息之前 ,这样他们就不会互相干扰!
wParam似乎总是(1)和lParam是一个NCCALCSIZE_ParaMS …
其目的就是要完成你所说的:强制整个窗口成为“客户端”,然后使用Vista DWM API将框架扩展到客户区域。 我只是不明白为什么它移动到左边
如果我跟踪或断点HandleNCCalcSize方法,当我调整窗口的大小(当它在边缘上,因此捕捉触发),NCCalcSize被调用两次:一旦它应该是,然后关闭到左边,它结束的地方向上。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。