2013-10-01 87 views
4

我在C# .NET操縱Excel工作表開發的小應用程序,我不知道爲什麼有些用戶一直告訴我,當他們打開Excel文件中的窗口不會出現在前面/頂,雖然我設置可見真和最大化窗口狀態。力量把excel窗口帶到前面?

這是讀取的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;  
} 

任何想法?

+0

難道是因爲你設置'WindowState'後,你實際上打開工作簿? – gunr2171

+1

如果你的.NET代碼仍然留下了一些代碼來執行您的Excel應用程序打開後,然後將焦點設置回你的計劃。如果你的程序有GUI,那麼它將在Excel之上。這麼一件事,你可以嘗試是招行開擴Excel中的烏爾代碼 –

+1

我想這結束,但它沒有工作,事情是,我不能重現我的機器上的問題,因爲它工作得很好在我的... –

回答

3

有時,如果有不止一個打開文件在Excel中同時ActiveWindow.Activate()將無法​​正常工作。

一個成功的竅門是做最小化然後最大化命令。

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

有點晚了,我知道,但爲什麼需要使用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 
} 

如果不止一個窗口有不會有任何問題同一標題。

2

一些魔術,我的工作:

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