我将从头开始,我正在开发一个跨越多个监视器的应用程序,每个监视器将包含一个WPF窗口,并且这些窗口使用单个viewmodel类进行控制。现在假设我在200,300(x,y)的所有窗口上都有一个按钮,我希望这个按钮应该负责同一窗口上的工具,而所有其他人都负责应用程序。 当我尝试获得当前鼠标位置或最后点击位置时,我获得相对于当前监视器的位置,即在这种情况下为200,300,而不管我在哪个屏幕上。
按照我试图获取鼠标位置的代码
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetCursorPos(ref Win32Point pt);
[StructLayout(LayoutKind.Sequential)]
internal struct Win32Point
{
public Int32 X;
public Int32 Y;
};
public static Point GetMousePosition()
{
Win32Point w32Mouse = new Win32Point();
GetCursorPos(ref w32Mouse);
return new Point(w32Mouse.X, w32Mouse.Y);
}
Point point = Control.MousePosition;
Mouse.GetPosition(null);
以下是应该返回屏幕号的代码。
private int ConvertMousePointToScreenIndex(System.Windows.Point mousePoint)
{
//first get all the screens
System.Drawing.Rectangle ret;
for (int i = 1; i <= System.Windows.Forms.Screen.AllScreens.Count(); i++)
{
ret = System.Windows.Forms.Screen.AllScreens[i - 1].Bounds;
if (ret.Contains(new System.Drawing.Point((int)mousePoint.X, (int)mousePoint.Y)))
return i - 1;
}
return 0;
}
我总是将屏幕设为0 :( 请帮助我获得适当的价值
答案 0 :(得分:14)
您可以使用Screen
静态类吗?
例如:
Screen s = Screen.FromPoint(Cursor.Position);
或者使用以下方式从特定表单获取当前屏幕:
Screen s = Screen.FromControl(this);
this
是您的表单控件。
http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.aspx
答案 1 :(得分:2)
感谢KnottytOmo,它现在有效,可能是那时还有其他错误。 我将代码更改为
private int ConvertMousePointToScreenIndex(Point mousePoint)
{
//first get all the screens
System.Drawing.Rectangle ret;
for (int i = 1; i <= Screen.AllScreens.Count(); i++)
{
ret = Screen.AllScreens[i - 1].Bounds;
if (ret.Contains(mousePoint))
return i - 1;
}
return 0;
}
并将其称为ConvertMousePointToScreenIndex(System.Windows.Forms.Cursor.Position);