C# 强制将excel窗口置于最前面?

C# 强制将excel窗口置于最前面?,c#,excel,C#,Excel,我在C#.NET中开发了一个小应用程序,可以处理excel表格,我不知道为什么一些用户一直告诉我,当他们打开excel文件时,窗口不会出现在前面/顶部,尽管我将“可见”设置为true,并将“窗口状态”设置为“最大化” 此函数用于读取excel文件: 有什么想法吗?我会尝试通过 app.ActiveWindow.Activate(); 如果这不起作用,您可能会在上找到其他解决方案(涉及本机WinAPI调用)。有时,如果Excel中同时打开多个文件,ActiveWindow.Activate()将

我在
C#.NET
中开发了一个小应用程序,可以处理excel表格,我不知道为什么一些用户一直告诉我,当他们打开excel文件时,窗口不会出现在前面/顶部,尽管我将“可见”设置为true,并将“窗口状态”设置为“最大化”

此函数用于读取excel文件:


有什么想法吗?

我会尝试通过

app.ActiveWindow.Activate();

如果这不起作用,您可能会在

上找到其他解决方案(涉及本机WinAPI调用)。有时,如果Excel中同时打开多个文件,
ActiveWindow.Activate()
将不起作用

一个成功的技巧是先最小化命令,然后最大化命令。

我发现这是可行的


我知道有点晚了,但为什么需要使用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
}

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

一些对我有用的魔法:

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

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

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

  public static void BringExcelWindowToFront(Excel._Workbook xlBook)
  {
     var windows = xlBook.Windows;
     foreach (Excel.Window window in windows)
     {
        IntPtr handler = (IntPtr)window.Hwnd;

        SetForegroundWindow(handler);
        return;
     }
  }

是否因为您在实际打开工作簿后设置了
WindowState
?如果您的.Net代码在Excel应用程序打开后仍有一些代码需要执行,则会将焦点设置回您的程序。如果您的程序有GUI,那么它将位于Excel之上。所以,你可以尝试的一件事是,将打开Excel的行移到代码的末尾。我尝试了这个方法,但没有成功,问题是我无法在我的机器上重现这个问题,因为它在我的机器上运行得很好。当我尝试激活我想要的工作簿时,我打开了一个Excel应用程序,打开并最小化了两个Excel工作簿(按workbookname)和app.activewindow.activate,它并不总是使我想要的工作簿处于活动状态,请帮助此答案的好处是,即使应用程序尚未打开工作簿,它也可以工作。
app.WindowState = XlWindowState.xlMinimized; // -4140
app.WindowState = XlWindowState.xlMaximized; // -4137
  [DllImport("user32.dll")]
  [return: MarshalAs(UnmanagedType.Bool)]
  static extern bool SetForegroundWindow(IntPtr hWnd);

  public static void BringExcelWindowToFront(Excel._Workbook xlBook)
  {
     var windows = xlBook.Windows;
     foreach (Excel.Window window in windows)
     {
        IntPtr handler = (IntPtr)window.Hwnd;

        SetForegroundWindow(handler);
        return;
     }
  }