在拖动过程中,MonitorFromWindow(DefaultToNearest)不起作用
本文关键字:DefaultToNearest 不起作用 MonitorFromWindow 拖动 过程中 | 更新日期: 2023-09-27 18:15:27
我使用Windows API方法MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST)
作为我的WPF应用程序中一些覆盖的最大化功能的一部分。我们遇到的一个问题是,"最近的"窗口在拖动操作期间不更新(由窗口实例上的DragMove
触发)。
假设您在两个不同分辨率的屏幕之间拖动窗口,并在第二个屏幕上触发Aero Snap功能。这将触发对窗口大小的查询(消息WM_GETMINMAXINFO
)。在此场景中使用MonitorFromWindow
将返回错误的屏幕。这就好像MONITOR_DEFAULTTONEAREST
使用的数据直到拖动操作完成才更新,直到Aero Snap触发的调整大小函数完成才完成。在回答WM_GETMINMAXINFO
查询之前,是否有办法刷新当前窗口位置?
由于抓取是基于鼠标位置的,因此解决该问题的方法是使用GetCursorPos
来获取当前鼠标位置。然后将该点传递给MonitorFromPoint
,以获取当前包含鼠标指针的监视器的句柄。
一个简单的例子:
[DllImport("User32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetCursorPos(ref Point lpPoint);
public const int MONITOR_DEFAULTTONEAREST = 2;
[DllImport("User32.dll")]
public static extern IntPtr MonitorFromPoint(Point pt, UInt32 dwFlags);
public IntPtr GetCurrentMonitor()
{
Point p = new Point(0,0);
if (!GetCursorPos(ref p))
{
// Decide what to do here.
}
IntPtr hMonitor = MonitorFromPoint(p, MONITOR_DEFAULTTONEAREST);
// validate hMonitor
return hMonitor;
}