C#:应用程序在哪个监视器?

时间:2014-04-04 12:18:13

标签: c# .net

有两个监视器,一个应用程序(例如IE)当前在第二个监视器中处于活动/显示状态。如何检测应用程序是在第一个还是第二个监视器中。 我需要知道这一点 - 在应用程序之上显示用户表单,而不管它是什么监视器。我知道WindowText(标题)是什么(如果有帮助)。

现在我只是在系统托盘附近显示我的表单,但希望在应用程序顶部显示

// FORM POSITION
this.StartPosition = FormStartPosition.Manual;
Rectangle workArea = Screen.PrimaryScreen.WorkingArea;
int left = workArea.Width - this.Width;
int top = workArea.Height - this.Height;
this.Location = new Point(left, top);

2 个答案:

答案 0 :(得分:0)

要获取另一个进程的窗口位置,您可以使用此处提到的库

How to get and set the window position of another application in C#

然后,您应该能够检查矩形位置

的屏幕
private Screen IsVisibleOnScreen(Rectangle rect)
{
    foreach (Screen screen in Screen.AllScreens)
    {
        if (screen.WorkingArea.IntersectsWith(rect))
        {
            return Screen;
        }
    }

    return null;
}

答案 1 :(得分:0)

这是从VB转换而来的。但

Test()方法显示了如何使用它。

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);


[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle);

public static RECT GetWindowLocationByName(string name)
{
    IntPtr handle = FindWindow(default(string), name);
    RECT result = default(RECT);
    GetWindowRect(handle, ref result);
    return result;
}

public static void Test()
{
    dynamic location = GetWindowLocationByName("Untitled - Notepad");
    Screen result = null;

    foreach (Screen s in Screen.AllScreens) {
        if (s.WorkingArea.IntersectsWith(new Rectangle(location.Left, location.Top, location.Right - location.Left, location.Bottom - location.Top))) {
            result = s;
        }
    }
}

修改:更多信息

第1步:获取窗口句柄 第2步:获取窗口rect(位置/大小) 第3步:确定监视窗口所在的位置

如果你在另一个窗口上方看到过多的窗口,你实际上并不需要知道窗口相对于桌面的位置和大小。设置窗口位置时,在窗体和WPF中,X / Left是距离最左侧监视器左侧的距离(以像素为单位)。例如,如果你有两个montior 1024像素宽设置X / Left到2000将窗口86像素放入右手监视器。