确定何时移动WPF窗口

Ton*_*ile 5 c# windows wpf window

我正在研究一个派生自WPF Window类的类,它作为一个名为的应用程序工具栏窗口AppBarWindow.我已经能够找到各种WinForms实现,但没有WPF实现.

我有很多代码可以工作,但我需要知道用户何时开始在屏幕上拖动窗口以及何时停止,因为窗口的行为会有所不同.默认的WPF处理不太正确,所以我实现了自己的Window Procedure并使用HwndSource对象安装它.

我在工作中没有非客户区的应用程序中工作.在这种情况下,有一个LeftMouseButtonDown事件处理程序将标志设置为true,然后调用DragMove拖动窗口的方法.当该方法返回时,我将标志设置为false.一切正常.

但是我现在正在使用一个不使用该DragMove方法的通用类.我可以LeftMouseButtonDown为窗口添加另一个处理程序,但如果鼠标位于非客户区域,我不相信会被调用.

如何检测用户是否正在拖动窗口以及它们在这种情况下何时停止?

Ton*_*ile 8

通过监视从Win32发送到我的窗口的消息,我已经找到了我需要知道的东西.

简而言之,Windows在窗口开始移动时发送以下消息:

WM_ENTERSIZEMOVE

接下来,Windows按顺序将以下消息发送到我的窗口过程:

  • WM_MOVING
  • WM_WINDOWPOSCHANGING
  • WM_GETMINMAXINFO
  • WM_WINDOWPOSCHANGED
  • WM_MOVE

接下来是一条代码为0xc310的消息.这在任何地方都没有记录,所以我猜这是由.NET/WPF内部使用的.

这些6条消息在鼠标移动时重复发送,窗口跟随后.

最后,当您释放鼠标左键时,Windows会发送:

  • WM_EXITSIZEMOVE

所以我需要监听WM_ENTERSIZEMOVE和WM_EXITSIZEMOVE消息.