使用C#确定窗口是否可见

16

我有一个混合控制台/表单应用程序,使用C#编写,目前,我必须依赖于user32.dll来显示/隐藏控制台窗口。但是我似乎找不到一种方法来确定控制台窗口是否隐藏或可见(而不是自己存储该值)。

4个回答

22

IsWindowVisible 函数:

IsWindowVisible 函数检索指定窗口的可见性状态。

C# 签名来自于 pinvoke.net:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsWindowVisible(IntPtr hWnd);

2
这将不会检查窗口是否实际可见。请阅读MSDN文章。 - devoured elysium
1
我认为你需要: [DllImport(USER32)] public static extern bool IsIconic(IntPtr hWnd); - Kate
2
如果窗口被其他窗口遮挡或被其父窗口剪裁,则具有WS_VISIBLE样式的任何绘图都不会显示在窗口中。这意味着无论是否可见,此语句将返回true。 - David
FYI(获取窗口句柄):var source = new WindowInteropHelper(myWindow).Handle; - Arsen Khachaturyan
如何将winForm的Visible属性设置为true?在Program.cs中,我尝试使用ShowWindow但不成功。 - Ruyut

1

现在有同样的问题,我是这样解决的:

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(Point lpPoint);

var mainForm = this; // or any other form you like to check
bool windowIsInvisible =  
    WindowFromPoint(new Point(mainForm.Left, mainForm.Top)) != mainForm.Handle || // topleft invisible
    WindowFromPoint(new Point(mainForm.Left + mainForm.Width - 1, mainForm.Top)) != mainForm.Handle || // topright invisible
    WindowFromPoint(new Point(mainForm.Left, mainForm.Top + mainForm.Height - 1)) != mainForm.Handle || // downleft invisible
    WindowFromPoint(new Point(mainForm.Left + mainForm.Width -1, mainForm.Top + mainForm.Height -1)) != mainForm.Handle; // downright invisible

0

我在一个C#控制台应用程序中使用这个函数来确定程序是通过命令行启动还是在控制台窗口中可见(例如通过System.Diagnostics.Process.Start()并设置CreateNoWindow = true)。

public static bool IsConsoleVisible()
{
    try
    {
        return Console.WindowHeight > 0;
    }
    catch (System.IO.IOException ex)
    {
        if (ex.Message.Contains("The handle is invalid."))
        {
            return false;
        }
        else
        {
            throw ex;
        }
    }
}

也许这会适用。


0

我在使用 IsWindowVisible 没有成功。

结果发现我需要使用 IsIconic,它的意思是 "如果窗口最小化"

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsIconic(IntPtr hWnd);

public static bool GetIsWindowMinimized(IntPtr hWnd)
{
    return IsIconic(hWnd);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接