Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Adobe Reader aus Access heraus schließen

Begonnen von Salvation, Mai 26, 2011, 08:49:01

⏪ vorheriges - nächstes ⏩

Salvation

Hi,

ich habe wieder mal ein kleines Probelm und das Internet war da nicht grade hilfreich. Ich hab nun nochmehr Fragezeichen vor meinem Kopf als vorher. Aber zu meinem Problem.

Ich habe es ja nun hinbekommen, dass ich PDFs aus Access herraus drucke. Dafür startet im Hintergrund - das Fenster erscheint nur in der Taskleiste und nicht groß, so dass ich automatisch einen Blickdaruf werfe - und druckt dann die Datei. Das Fenster bleibt grau, also ich bekomme den Inhalt nicht angezeigt.

So weit so gut, nun möchte ich jedoch, dass sich der Adobe Reader nach dem Drucken - bzw. nachdem er den Druckbefehl geschickt hat - wieder schließt.

Ich hab wohl den Befehl WM_Close gefunden, aber dieser hilft mir so, ohne das ich weiss, wie und wo ich ihn anwenden muss, nicht weiter.

Kann mir da vielleicht jemand weiterhelfen?

Vielen Dank schonmal.

LG Salvation

Salvation

Hi,

folgenden Code hab ich nun ausprobiert:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
                        ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _
                        ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Const WM_CLOSE = &H10

Public Sub Kill()
Dim Ergebnis
Ergebnis = Shell("C:\Dokumente und Einstellungen\prakedv2\Eigene Dateien\TestPDF.pdf", vbNormalFocus)
    Dim WinWnd As Long

    WinWnd = FindWindow(vbNullString, "TestPDF.pdf") ' Name in "" muss passen!

    If WinWnd <> 0 Then
        PostMessage WinWnd, WM_CLOSE, 0&, 0&
    Else
        MsgBox "No window of that name exists."
        End If

End Sub



Die PDF wird geöffnet, jedoch bekommen ich folgende Fehlermeldung:

Laufzeitfehler '5':
Ungültiger Prozeduraufruf oder ungültiges Aggument



Und dabei wird mir folgender Codeteil gelb makiert:

Ergebnis = Shell("C:\Dokumente und Einstellungen\prakedv2\Eigene Dateien\TestPDF.pdf", vbNormalFocus)


LG Salvation

Salvation

Erweitert, bzw verändert, dennoch ein Problem

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
                                   ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _
                                   ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Const WM_CLOSE = &H10

Public Sub Kill()
'Dim Ergebnis
'Ergebnis = Shell("", vbNormalFocus)
    Dim WinWnd As Long

    WinWnd = FindWindow(vbNullString, "TestPDF - Adobe Reader") ' Name in "" muss passen!

    If WinWnd <> 0 Then
        PostMessage WinWnd, WM_CLOSE, 0&, 0&
    Else
        MsgBox "No window of that name exists."
        End If

End Sub


Ich bekomme die Meldung "No window of that name exist." Dabei hab ich genau den Title der PDF eingegeben, so wie es auch im Kopf steht.

LG Salvation

Hondo

Hallo,
Prinzipiell ist das der richtige Weg, den Fensterhandle suchen und per API das Fenster schließen.
Mach doch mal eine Schleife über alle offenen Fenster und sieh dir die Namen an, eventuell wird er anderst geschrieben?

Andreas

Salvation

Hi,

okay, auch wenn ich einige koriouse Fragen stelle und mir irgendwie alles zusammen suche, weiss ich leider nicht alles. *schäm*

Wie kann ich eine Schleife basteln, die mir dann die Namen der offenen Fenster rausgibt?

LG Salvation

Hondo


Salvation

Hi,

also, mit diesem netten Code bekomme ich es hin, dass ich eingeben kann ob das Fenster geöffnet ist, oder nicht, aber nicht, welchen Namen die Datei trägt.

Option Explicit

'Listet alle aktiven Fenter / Applikation auf
Private Declare Function GetWindow Lib "User32" _
    (ByVal appWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" _
    (ByVal appWnd As Long, ByVal wIndx As Long) As Long
Private Declare Function GetWindowTextLength Lib "User32" Alias "GetWindowTextLengthA" _
    (ByVal appWnd As Long) As Long
Private Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" _
    (ByVal appWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" _
    (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long


Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GWL_STYLE = (-16)
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000


Sub Start_Test_Run()
    Dim chkName As String
    chkName = InputBox _
    ("Geben Sie den Fenstertitel ein." & Chr$(13) & _
    "ACHTUNG: Case Sensitiv !!", "Suche Application", "Excel")
        If chkName = "" Then Exit Sub
    If Check_Open_Application(chkName) = True Then
        MsgBox chkName & ": Geöffnet"
    Else
        MsgBox chkName & ": Nicht Geöffnet"
    End If
End Sub

Function Check_Open_Application(AppName As String) As Boolean
    'Test Function
    'Parameter 0: Es wird jedes Fenster explicit nach dem String überprüft
    'Parameter 1: Alle geöffneten Programme werden in einer MsgBox angezeigt.
    If GetWindowList(AppName, 0) Then
        Check_Open_Application = True
    Else
        Check_Open_Application = False
    End If
End Function


Public Function GetWindowList(findApp As String, kindMsg As Integer) As Boolean
    'Gibt True zurück wenn die Applikation aktiv ist
    Dim app() As Long
    Dim appWnd As Long, appTitle As String, appStyle As Long, appTask_name() As String
    Dim appCount As Integer, appIndex As Integer, appFound As Boolean
    Dim msgTxt As String
    appWnd = FindWindow(ByVal 0&, ByVal 0&)
    appWnd = GetWindow(appWnd, GW_HWNDFIRST)
    '1. Initialisierung
    GetWindowList = False
    Do
        'Loop starten durch alle geöffneten Fenster
        appFound = False
        appStyle = GetWindowLong(appWnd, GWL_STYLE)
        appStyle = appStyle And (WS_VISIBLE Or WS_BORDER)
        appTitle = GetWindowTitle(appWnd)
        'Alle gefundenen Applicationen in einen Array aufnehmen
        If (appStyle = (WS_VISIBLE Or WS_BORDER)) = True Then
            If Trim(appTitle) <> "" Then
                For appIndex = 1 To appCount
                    If appTask_name(appIndex) = appTitle Then
                        appFound = True
                        Exit For
                    End If
                Next appIndex
                If Not appFound Then
                    appCount = appCount + 1
                    ReDim Preserve appTask_name(1 To appCount)
                    appTask_name(appCount) = appTitle
                    ReDim Preserve app(1 To appCount)
                    app(appCount) = appWnd
                End If
            End If
        End If
        appWnd = GetWindow(appWnd, GW_HWNDNEXT)
    Loop Until appWnd = 0
    'Durchsuchen des erstellten Arrays nach der Application
    If kindMsg = 0 Then
        For appIndex = 1 To appCount
            'Es wird nur der übergebene String in "appTask_Name" gesucht
            'Die Instanz selbst wird nicht identifiziert.
            'Dazu müsste noch der String "Microsoft" geprüft werden
            If InStr(1, appTask_name(appIndex), findApp) > 1 Then
                'Application gefunden = Ende der Schleife
                GetWindowList = True
                Exit Function
            End If
        Next appIndex
        ElseIf kindMsg = 1 Then
        For appIndex = 1 To appCount
            msgTxt = msgTxt & "Aktiv: " & appTask_name(appIndex) & Chr$(13)
        Next appIndex
        MsgBox msgTxt
        GetWindowList = True
    End If
End Function

Private Function GetWindowTitle(ByVal appWnd As Long) As String
    Dim appResult As Long, appTempStr As String
    appResult = GetWindowTextLength(appWnd) + 1
    appTempStr = Space(appResult)
    appResult = GetWindowText(appWnd, appTempStr, appResult)
    GetWindowTitle = Left(appTempStr, Len(appTempStr) - 1)
End Function


Und mit dem Code auf dieser Seite http://www.herber.de/forum/archiv/1156to1160/t1158568.htm bekomme ich nur die Ausgabe vom Access Fenster, aber keine weitere.

LG Salvation

Hondo

Hallo,
setzt mal ein Haltepunkt bei If kindMsg = 0 Then und starte den Code indem du "Start_Test_Run" ausführst.
Also bei mir hat er zumindest mal Outlook gefunden.

Andreas

Salvation

Hi,

finden kann ers bei mir auch. Dann bis meldung, ob geöffnet oder nicht. Also geöffnet, wenn ich auch in der Taskleiste habe. Da findet er bei mir den Adobe Reader, wie aich den Internet Explorer.

Nur wie soll ich mir dann die Fensternamen anzeigen lassen? Das geht mit dem zweiten Quellcode, jedoch hat der immer Focus auf Access und sieht damit die anderen Fenster nicht, slebst wenn ich sie hoch habe.

*im Moment leicht verwirrt ist*

Salvation

Hondo

Das steht doch im Code:
Es wird nur der übergebene String in "appTask_Name" gesucht
appTask_name(appIndex) liefert dann den Namen bzw. den Fenstertitel der Aplikation.
Was ist daran verwirrend?

Andreas

Salvation

#10
Hi,

Weil, wenn ich da eingebe, wonach er suchen soll zwei Versionen bekomme

Gebe ich Adobe Reader ein, bekomme ich ein Geöffnet und
gebe ich Reader ein, bekomme ich auch ein Geöffnet.

Genaue Ausgabe:

Adobe Reader : Geöffnet

Reader : Geöffnet


Das verwirrt mich.

Dieser Code:

Option Compare Database
Option Explicit

Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" ( _
   ByVal hwnd As Long, _
   ByVal lpString As String, _
   ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" ( _
   ByVal hwnd As Long) As Long

Public Sub test()
   Dim lngHwnd As Long, lngReturn As Long
   Dim strCaption As String
   lngHwnd = GetForegroundWindow
   lngReturn = GetWindowTextLength(lngHwnd)
   strCaption = Space$(lngReturn)
   Call GetWindowText(lngHwnd, strCaption, lngReturn + 1)
   MsgBox strCaption
End Sub


Gibt mir mehr aus. Sprich auch, was genau ich davon geöffnet habe. nur dieser bezieht sich NUR aufs Access Fenster und ignoriert alle anderen.

LG Salvation

Hondo

Hallo,
na klar weil das Wort Reader auch in Acrobat Reader drinsteckt.
Sieh dir doch mal den Code an. Wieviel Ahnung von VBA hast du eigentlich?

If InStr(1, appTask_name(appIndex), findApp) > 1 Then
Sucht doch die Eingabe findApp innerhalb des Strings appTask_name(appIndex)

Andreas

Salvation

Hi,

ZitatWieviel Ahnung von VBA hast du eigentlich?

Hm... ich stufe mich selbst mit "Null Erfahrung" ein. Warum? Sagen wir es so. Access als Datenbankprogramm hab ich schon oft genutzt, nur VBA nicht. Da ich nun in einer Umschulung bin, mache ich mein Praktikum in einem Krankenhaus, die gerne Programme mit Access und VBA haben möchten. Ich habe hier fertige Programme, die ich mir anschauen kann, nur - sorry, falls ich nun jemanden zu nahe trete - wenn ich mit Null erfahrung reingehe, man von mir erwartet, dass ists hinbekomme, aber ich weder Bücher, noch Hilfe von jemanden bekomme, der es mir erklärt, versteh ich nicht die Funktionen.

Ich beiss mich durch, bzw. wie ichs sage, schummel mich durch. Ich hab leider nur einige Foren, wo ich schauen kann und versuch mich selbst erstmal im Netz schlau zu machen. Nur wie gesagt, wenn man zum Teil nicht mal den Code versteht, ist es nicht immer einfach.

Sorry.

Hondo

Hallo,
OK, dann ist deine Frage verständlich.
Ich werd mal schauen ob ich für dich die Anwendung umstricken kann.

Andreas

Salvation

Hi,

danke. Echt nett von dir.
Wenn ichs mir aussuchen könnte, würde ich auch eher eine Programmiersprache nehmen, wo ich wenigstens einen Ansprechpartner habe. Ich kann es mir nur leider nicht aussuchen und lernen muss ich es irgendwann. Nur dass ich es auf diese Weise lernen musst, das hätte ich mir auch anders vorgestellt.

LG Salvation