Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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
C# 监视器FromWindow(DefaultToNearest)不';拖动时不工作_C#_Wpf_Winapi - Fatal编程技术网

C# 监视器FromWindow(DefaultToNearest)不';拖动时不工作

C# 监视器FromWindow(DefaultToNearest)不';拖动时不工作,c#,wpf,winapi,C#,Wpf,Winapi,我正在使用Windows API方法MonitorFromWindow(hwnd,MONITOR\u DEFAULTTONEAREST)作为我的WPF应用程序中某些重写的最大化功能的一部分。我们遇到的一个问题是,“最近的”窗口在拖动操作期间不会更新(由窗口实例上的DragMove触发) 假设在两个分辨率不同的屏幕之间拖动窗口,并在第二个屏幕上触发Aero Snap功能。这会触发对窗口大小的查询(消息WM\u GETMINMAXINFO)。在这种情况下使用MonitorFromWindow会返回错

我正在使用Windows API方法
MonitorFromWindow(hwnd,MONITOR\u DEFAULTTONEAREST)
作为我的WPF应用程序中某些重写的最大化功能的一部分。我们遇到的一个问题是,“最近的”窗口在拖动操作期间不会更新(由窗口实例上的
DragMove
触发)


假设在两个分辨率不同的屏幕之间拖动窗口,并在第二个屏幕上触发Aero Snap功能。这会触发对窗口大小的查询(消息
WM\u GETMINMAXINFO
)。在这种情况下使用
MonitorFromWindow
会返回错误的屏幕。这就好像在拖动操作完成之前,
MONITOR\u DEFAULTTONEAREST
使用的数据不会更新,而在Aero Snap触发的调整大小功能完成之前,数据也不会更新。在回答
WM_GETMINMAXINFO
查询之前,是否有方法刷新当前窗口位置?

由于捕捉基于鼠标位置,因此问题的解决方案是使用获取当前鼠标位置。然后传递该点以获取当前包含鼠标指针的监视器的句柄

一个简单的例子:

[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;
}

MonitorFromWindow
正在内部使用
MonitorFromRect
。不必更新窗口属性,您只需直接针对感兴趣的坐标使用另一个函数即可。