我有一个混合控制台/表单应用程序,使用C#编写,目前,我必须依赖于user32.dll来显示/隐藏控制台窗口。但是我似乎找不到一种方法来确定控制台窗口是否隐藏或可见(而不是自己存储该值)。
IsWindowVisible 函数检索指定窗口的可见性状态。
C# 签名来自于 pinvoke.net:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsWindowVisible(IntPtr hWnd);
现在有同样的问题,我是这样解决的:
[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
我在一个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;
}
}
}
也许这会适用。
我在使用 IsWindowVisible
没有成功。
结果发现我需要使用 IsIconic
,它的意思是 "如果窗口最小化"
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsIconic(IntPtr hWnd);
public static bool GetIsWindowMinimized(IntPtr hWnd)
{
return IsIconic(hWnd);
}
var source = new WindowInteropHelper(myWindow).Handle;
- Arsen Khachaturyan