从VB.NET应用程序调用Excel时,如何让Excel出现在应用程序前面?

问题描述:

我有一个VB.NET应用程序,它使用Microsoft.Office.Interop.Excel来简单地打开一个电子表格,向其中抽取一些数据,刷新数据透视表中的数据,然后向用户显示电子表格。从VB.NET应用程序调用Excel时,如何让Excel出现在应用程序前面?

的代码非常简单(处理未显示错误):

' Start Excel Application 
    xlApp = New Excel.ApplicationClass 

    ' Get Excel Workbooks 
    xlWorkBooks = xlApp.Workbooks 

    ' Open workbook 
    xlWorkBook = xlWorkBooks.Open(Filename:=sExcelDocFullPath, IgnoreReadOnlyRecommended:=blnIgnoreReadOnly) 

    If Not xlWorkBook Is Nothing Then 

     ' Pump some data over (code not shown) 
     ' Make the first worksheet in the document active 
     CType(xlWorkBook.Worksheets(1), Excel.Worksheet).Activate() 

     'Return control of Excel to the user 
     xlApp.Visible = True 
     xlApp.UserControl = True 

     ' Refresh workbooks (with alerts off, so as not to hassle user) 
     xlApp.DisplayAlerts = False 
     xlWorkBook.RefreshAll() 
    End If 

时运行这些代码会发生什么事,是Excel中打开了调用应用程序的后面,因为我们是刷新数据连接,在调用应用程序后面还会显示小型Excel“SQL Server登录”对话框,因此用户需要将ALT + TAB添加到Excel或单击任务栏中的Excel - 对用户来说这两者都不是很好的体验。我们希望登录对话框出现在呼叫应用程序的前面。

任何人都可以建议如何实现?我尝试将可见的& UserControl属性的设置移动到RefreshAll之后,但这没有任何区别。

干杯,

Chris。

+0

我们有类似的问题,并尝试了不同的方法。首先,您可以将windowState属性设置为XlMaximized(或XlNormal)。对于其他选项,您需要窗口句柄,并在有窗口句柄时将其告知onTop。但找到句柄并不容易...... Excel应用程序hwnd中有一个属性。此外,你可以从窗口形成工作簿 –

对不起,C#,我不知道VB,所以我不能我自己翻译,但主要的想法是使用WinAPI的:

[DllImport("user32.dll", SetLastError = true)] 
public static extern bool BringWindowToTop(IntPtr hWnd); 

您可以从xlApp得到HWND:

BringWindowToTop((INtPtr)XlApp.Hwnd); 
+0

谢谢亚历克斯 - 这是做的伎俩!在VB中它只是BringWindowToTop(CType(xlApp.Hwnd,IntPtr)) –