2012-02-29 207 views
0

在我的程序中,我想打開一個Excel文件並給出Excel焦點。如何通過C#打開Excel並提供Excel焦點

我使用process.Start()來做到這一點,它只能在第一次打開Excel時運行,它會啓動Excel併爲其提供焦點。

但是,如果我不收集第一個Excel或者這已經是我的系統中打開的Excel,並且返回到我的程序,打開另一個Excel,這次,新打開的Excel不會被帶到前臺並沒有重點。

我試圖使用Windows API來獲取窗口和設置的重點,但它拋出一個異常時,打開第二個Excel中:

process.MainWindowHandle = 'process.MainWindowHandle' threw an exception of type 'System.InvalidOperationException' 

誰能幫助我?提前致謝。

回答

1

在嘗試訪問MainWindowHandle之前,您很可能只需致電WaitForInputIdle。這將一直等到Excel啓動後才能分配主窗口句柄。

現在我發現的另一件事是,Excel可能會耗盡一個進程。因此,第二次執行Process.Start()時,實際發生的情況是第二個進程將請求傳遞給第一個進程,然後立即關閉。你可以使用任務管理器來測試這個假設。如果我是對的,那麼使用Process.GetProcesses()來獲取所有正在運行的進程的列表,找到Excel進程並給出主窗口的焦點。

+0

我試過添加WaintForInputIdle,第一次打開excel,沒關係,但是在那之後,如果我嘗試打開另一個Excel,我會得到一個異常'沒有進程與此對象關聯。在process.WaitForInputIdle()和進程的每個屬性都是[process.xxxx'拋出'System.InvalidOperationException'類型的異常],就像一個沒有調用start()方法的進程一樣。 – zousijiu 2012-02-29 13:02:07

+0

好的,我有另外一個想法。我在這裏猜測,因爲它很難通過堆棧溢出進行調試! – 2012-02-29 13:12:57

0

而不是直接shell到Excel,只需指定您的excel文件作爲文件名,並確保它被設置爲使用ShellExecute。這將以與在資源管理器中雙擊相同的方式加載它。它還具有與其他excel觀衆一起工作的優勢。