【问题标题】:C# show hidden windowC# 显示隐藏窗口
【发布时间】:2011-11-21 10:06:03
【问题描述】:

我正在为 excel 开发一个插件。在某些时候,我可以接收异步事件。如果隐藏在这些事件中,我需要能够显示 Excel 窗口。

我能够存储 Hwnd 属性,我认为它必须是一个不可变的 int/reference 来标识我的 Excel 窗口。

有人可以详细说明这个 Hwnd 吗?并解释如何使用它从 C# 中显示隐藏窗口?

在此先感谢各位;)

更新:很快,那段代码就解决了我的问题:

    /// <summary>Enumeration of the different ways of showing a window using
    /// ShowWindow</summary>
    private enum WindowShowStyle : uint
    {
        /// <summary>Hides the window and activates another window.</summary>
        /// <remarks>See SW_HIDE</remarks>
        Hide = 0,
        /// <summary>Activates and displays a window. If the window is minimized
        /// or maximized, the system restores it to its original size and
        /// position. An application should specify this flag when displaying
        /// the window for the first time.</summary>
        /// <remarks>See SW_SHOWNORMAL</remarks>
        ShowNormal = 1,
        /// <summary>Activates the window and displays it as a minimized window.</summary>
        /// <remarks>See SW_SHOWMINIMIZED</remarks>
        ShowMinimized = 2,
        /// <summary>Activates the window and displays it as a maximized window.</summary>
        /// <remarks>See SW_SHOWMAXIMIZED</remarks>
        ShowMaximized = 3,
        /// <summary>Maximizes the specified window.</summary>
        /// <remarks>See SW_MAXIMIZE</remarks>
        Maximize = 3,
        /// <summary>Displays a window in its most recent size and position.
        /// This value is similar to "ShowNormal", except the window is not
        /// actived.</summary>
        /// <remarks>See SW_SHOWNOACTIVATE</remarks>
        ShowNormalNoActivate = 4,
        /// <summary>Activates the window and displays it in its current size
        /// and position.</summary>
        /// <remarks>See SW_SHOW</remarks>
        Show = 5,
        /// <summary>Minimizes the specified window and activates the next
        /// top-level window in the Z order.</summary>
        /// <remarks>See SW_MINIMIZE</remarks>
        Minimize = 6,
        /// <summary>Displays the window as a minimized window. This value is
        /// similar to "ShowMinimized", except the window is not activated.</summary>
        /// <remarks>See SW_SHOWMINNOACTIVE</remarks>
        ShowMinNoActivate = 7,
        /// <summary>Displays the window in its current size and position. This
        /// value is similar to "Show", except the window is not activated.</summary>
        /// <remarks>See SW_SHOWNA</remarks>
        ShowNoActivate = 8,
        /// <summary>Activates and displays the window. If the window is
        /// minimized or maximized, the system restores it to its original size
        /// and position. An application should specify this flag when restoring
        /// a minimized window.</summary>
        /// <remarks>See SW_RESTORE</remarks>
        Restore = 9,
        /// <summary>Sets the show state based on the SW_ value specified in the
        /// STARTUPINFO structure passed to the CreateProcess function by the
        /// program that started the application.</summary>
        /// <remarks>See SW_SHOWDEFAULT</remarks>
        ShowDefault = 10,
        /// <summary>Windows 2000/XP: Minimizes a window, even if the thread
        /// that owns the window is hung. This flag should only be used when
        /// minimizing windows from a different thread.</summary>
        /// <remarks>See SW_FORCEMINIMIZE</remarks>
        ForceMinimized = 11
    }

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow);

    static void ContentClick(object obj, EventArgs ea)
    {
        Microsoft.Office.Interop.Excel.Application oExcelApp = (Microsoft.Office.Interop.Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
        oExcelApp.Visible = true;
        ShowWindow( (System.IntPtr) Globals.ThisWorkbook.Application.Hwnd, WindowShowStyle.ShowMaximized);
    }

【问题讨论】:

    标签: c# windows hwnd


    【解决方案1】:

    hWnd 表示窗口句柄。它是窗口实例的标识句柄。

    至于显示它,您可以使用user32.ShowWindow API。这是 P/Invoke 签名,由 pinvoke.net 提供:

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);
    

    这是ShowWindowCommands 枚举:

    /// <summary>Enumeration of the different ways of showing a window using
    /// ShowWindow</summary>
    private enum WindowShowStyle : uint
    {
        /// <summary>Hides the window and activates another window.</summary>
        /// <remarks>See SW_HIDE</remarks>
        Hide = 0,
        /// <summary>Activates and displays a window. If the window is minimized
        /// or maximized, the system restores it to its original size and
        /// position. An application should specify this flag when displaying
        /// the window for the first time.</summary>
        /// <remarks>See SW_SHOWNORMAL</remarks>
        ShowNormal = 1,
        /// <summary>Activates the window and displays it as a minimized window.</summary>
        /// <remarks>See SW_SHOWMINIMIZED</remarks>
        ShowMinimized = 2,
        /// <summary>Activates the window and displays it as a maximized window.</summary>
        /// <remarks>See SW_SHOWMAXIMIZED</remarks>
        ShowMaximized = 3,
        /// <summary>Maximizes the specified window.</summary>
        /// <remarks>See SW_MAXIMIZE</remarks>
        Maximize = 3,
        /// <summary>Displays a window in its most recent size and position.
        /// This value is similar to "ShowNormal", except the window is not
        /// actived.</summary>
        /// <remarks>See SW_SHOWNOACTIVATE</remarks>
        ShowNormalNoActivate = 4,
        /// <summary>Activates the window and displays it in its current size
        /// and position.</summary>
        /// <remarks>See SW_SHOW</remarks>
        Show = 5,
        /// <summary>Minimizes the specified window and activates the next
        /// top-level window in the Z order.</summary>
        /// <remarks>See SW_MINIMIZE</remarks>
        Minimize = 6,
          /// <summary>Displays the window as a minimized window. This value is
          /// similar to "ShowMinimized", except the window is not activated.</summary>
        /// <remarks>See SW_SHOWMINNOACTIVE</remarks>
        ShowMinNoActivate = 7,
        /// <summary>Displays the window in its current size and position. This
        /// value is similar to "Show", except the window is not activated.</summary>
        /// <remarks>See SW_SHOWNA</remarks>
        ShowNoActivate = 8,
        /// <summary>Activates and displays the window. If the window is
        /// minimized or maximized, the system restores it to its original size
        /// and position. An application should specify this flag when restoring
        /// a minimized window.</summary>
        /// <remarks>See SW_RESTORE</remarks>
        Restore = 9,
        /// <summary>Sets the show state based on the SW_ value specified in the
        /// STARTUPINFO structure passed to the CreateProcess function by the
        /// program that started the application.</summary>
        /// <remarks>See SW_SHOWDEFAULT</remarks>
        ShowDefault = 10,
        /// <summary>Windows 2000/XP: Minimizes a window, even if the thread
        /// that owns the window is hung. This flag should only be used when
        /// minimizing windows from a different thread.</summary>
        /// <remarks>See SW_FORCEMINIMIZE</remarks>
        ForceMinimized = 11
    }
    

    【讨论】:

    • 谢谢,这似乎正是我所需要的。但是,如何包含和使用?我需要在某处粘贴签名吗?
    • using System.Runtime.InteropServices; 添加到文件顶部,然后将 P/Invoke 签名粘贴到您的班级中。然后,您可以像使用其他任何方法一样使用该方法。这篇文章应该解释清楚了:msdn.microsoft.com/en-us/magazine/cc164123.aspx
    • 好的,我现在知道它是如何工作的了。仍然,不构建,说 ShowWindowCommands 无法解决。
    • @jeromeG - 您还需要将ShowWindowCommands 枚举添加到您的代码中。从我喜欢的 pinvoke.net 页面复制枚举,以 /// &lt;summary&gt;Enumeration of the different ways of showing a window using 开头(我现在更新了我的答案以包括这个)
    • 没问题。很高兴它有帮助:]
    【解决方案2】:

    HWnd 是一个窗口句柄,在 C# 中它实际上是一个 IntPtr 类型。 尝试基于IWin32Window 创建一个包装类,并在调用Show() 时使用它,例如

    public class WndWrapper : IWin32Window
    {
        IntPtr m_Handle;
        public WndWrapper(long pHandle)
        {
            m_Handle = (IntPtr)pHandle;
        }
    
        #region IWin32Window Members
    
        public IntPtr Handle
        {
            get { return m_Handle; }
        }
    
        #endregion
    }
    

    然后这样称呼它:

    WndWrapper oWnd = new WndWrapper(pHandle);
    MyForm oDlg = new MyForm();
    oDlg.Show(oWnd);
    

    请小心,因为 HWND 元素是非托管的,您将负责确保在需要时将其处理掉。

    【讨论】:

    • 感谢您的回答,但我发现上面的那个更适合我的需要 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多