强行将excel窗口带到前面?

时间:2013-10-01 14:28:41

标签: c# excel

我在C# .NET开发了一个操作Excel工作表的小应用程序,我不知道为什么有些用户会告诉我,当他们打开excel文件时,窗口不会出现在前面/顶部,尽管我将visible设置为true,窗口状态设置为maximumized。

这是读取 excel 文件的函数:

public static void OpenExcel(string fileName, bool visibility, FunctionToExecute fn = null)
{
    string addInPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\AddIns\\mDF_XLcalendar.xla");

    deleg = fn;
    app = new Excel.Application();

    app.Workbooks.Open(addInPath);
    app.Workbooks.Open(fileName);

    app.ScreenUpdating = true;
    app.DisplayAlerts = true;
    app.Visible = visibility;
    app.UserControl = true;
    app.WindowState = Excel.XlWindowState.xlMaximized;

    EventDel_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeCloseEventHandler(application_WorkbookBeforeClose);
    EventSave_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeSaveEventHandler(Open_ExcelApp_WorkbookBeforeSave);

    app.WorkbookBeforeClose += EventDel_BeforeBookClose;
    app.WorkbookBeforeSave += EventSave_BeforeBookClose;     
} 

有什么想法吗?

6 个答案:

答案 0 :(得分:4)

我会尝试通过

激活excel窗口
app.ActiveWindow.Activate();

如果这不起作用,您可以在this thread at http://social.msdn.microsoft.com/找到其他解决方案(涉及原生WinAPI调用)

答案 1 :(得分:4)

我发现这个有效。 How to bring an Excel app to the front

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

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);   

public static void BringExcelWindowToFront(Application xlApp)
{

   string caption = xlApp.Caption;
   IntPtr handler = FindWindow(null, caption);
   SetForegroundWindow(handler);
}

答案 2 :(得分:3)

有时,如果在Excel中同时打开多个文件,ActiveWindow.Activate()将无效。

成功的诀窍是尽量减少然后最大化命令。

答案 3 :(得分:3)

一些魔法,对我有用:

app.WindowState = XlWindowState.xlMinimized; // -4140
app.WindowState = XlWindowState.xlMaximized; // -4137

答案 4 :(得分:2)

我知道有点晚了,但为什么需要使用FindWindow,可以通过应用程序访问Windows句柄:

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

public static void BringExcelWindowToFront(Application xlApp)
{
   SetForegroundWindow((IntPtr)xlApp.Hwnd);  // Note Hwnd is declared as int
}

如果多个窗口具有相同的标题,则不会出现问题。

答案 5 :(得分:0)

要激活特定的工作簿,请执行以下操作:

{{1}}