Вывод диалога ExcelAsAs на передний план Visual Basic (не VBA) - PullRequest
0 голосов
/ 07 января 2012

Я написал программу на Visual Basic, которая подключается к базе данных Access, делает несколько операторов SQL, а затем пытается записать результаты в файл Excel.

Все работает правильно, кроме случаев, когда он вызываетДиалог SaveAs:

xlApp.Dialogs(Excel.XlBuiltInDialog.xlDialogSaveAs).Show()

Диалог находится за программой, которая развернута.Таким образом, программа, кажется, зависает, ожидая закрытия диалогового окна, но доступ к диалоговому окну невозможен (кроме как с помощью Alt + Tab, но это ужасный обходной путь).

Любой способ заставить диалог вызватьспереди?Я нашел связанную тему здесь , но я не имею дело с отдельными темами.Там ОП предлагает метод BringToFront, но я не уверен, как его использовать с моими xlApp.Dialogs.

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 07 января 2012

Найдите дескриптор окна и позвоните SetForegroundWindow

Public Function FindWindowByPartialTitle(ByVal _
    TestFlex_string As String) As Long
    m_TestFlexString = TestFlex_string
    m_TestFlexHwnd = 0

    ' Enumerate windows.
    EnumWindows AddressOf EnumCallback, 0

    ' Return the hWnd found (if any).
    FindWindowByPartialTitle = m_TestFlexHwnd
End Function

' Check a returned task to see if it's the one we want.
Public Function EnumCallback(ByVal app_hWnd As Long, ByVal _
    param As Long) As Long
Dim buf As String
Dim title As String
Dim Length As Long

    ' Get the window's title.
    Length = GetWindowTextLength(app_hWnd)
    buf = Space$(Length)
    Length = GetWindowText(app_hWnd, buf, Length)
    title = Left$(buf, Length)

    ' See if the title contains the TestFlex string.
    If InStr(title, m_TestFlexString) <> 0 Then
        ' This is the one we want.
        m_TestFlexHwnd = app_hWnd

        ' Stop searching.
        EnumCallback = 0
    Else
        ' Continue searching.
        EnumCallback = 1
    End If
End Function

Таким образом, с помощью вышеуказанной функции вы сможете сделать что-то вроде:

Dim saveAsHwnd as Long

call saveAsHwnd = FindWindowByPartialTitle("Save")
call SetForegroundWindo(saveAsHwnd)

Не забудьте также деклассировать SetForegroundWindow:

Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
...