【问题标题】:Determine if a window is visible or not using C#使用 C# 确定窗口是否可见
【发布时间】:2011-02-09 00:02:02
【问题描述】:

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

【问题讨论】:

    标签: c# user32


    【解决方案1】:

    IsWindowVisible Function:

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

    来自pinvoke.net的C#签名:

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

    【讨论】:

    • 当窗口实际上可见时,它不会检查。阅读 msdn 文章。
    • 我认为你需要 [DllImport(USER32)] public static extern bool IsIconic(IntPtr hWnd);
    • "如果窗口被其他窗口遮挡或被其父窗口剪裁,则任何绘制到具有 WS_VISIBLE 样式的窗口的操作都不会显示。" - 这意味着无论是否可以看到它都会返回 true。
    • 仅供参考(获取您的窗口句柄):var source = new WindowInteropHelper(myWindow).Handle;
    • 如何将winForm Visible设置为true?在 Program.cs,我尝试 ShowWindow is Unsuccessful
    【解决方案2】:

    现在遇到了同样的问题,这样解决了:

    [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
    

    【讨论】:

      【解决方案3】:

      我在 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;
              }
          }
      }
      

      也许这将适用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        相关资源
        最近更新 更多