2011-11-21 182 views
3

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

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

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

在此先感谢乡亲;)

UPDATE:不久,那是一段代码排序我的问题:

/// <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); 
    } 

回答

9

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 
} 
+0

谢谢,这似乎是我真正需要的。但是,如何包含和使用?我需要粘贴签名吗? – Jerome

+1

将'using System.Runtime.InteropServices;'添加到文件的顶部,然后将P/Invoke签名粘贴到您的类中。然后您可以像使用其他方法一样使用该方法。这篇文章应该解释一切:http://msdn.microsoft.com/en-us/magazine/cc164123.aspx – Polynomial

+0

好吧,我明白了这是如何工作的。仍然不建立,说ShowWindowCommands不能解决。 – Jerome

1

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元素是非托管,你将负责确保它们被布置需要的情况下。

+0

感谢您的回答,但我发现上面的更适合我的需要;) – Jerome