Externe Fehlermeldungen im gesperrten Zustand bestätigen?!

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von MSB2000.

    Externe Fehlermeldungen im gesperrten Zustand bestätigen?!

    Hallo zusammen,

    ich habe ein Programm geschrieben welches zu jeder vollen Stunde ein externes Programm aufruft und ein Makro bzw. Suchanfrage von diesem Programm ausführt und exportiet diese in eine csv. Dabei ist der Rechner im gesperrten Anmeldezustand. Das ganze klappt super. Jetzt mein Problem:

    Ist in dem externen Fremdprogramm die Suche erfolglos erscheint eine Fehlermeldung: Keine passenden Suchergebnisse!
    Dieses Fenster ist mit OK zu bestätigen.

    Ich habe über einen Timer und Sendkey Enter versucht diese nach 45sek zu bestätigen - damit das externe Programm die nächste Suche starten kann (in Summer 3 Suchen). Leider funktioniert die SENDKEY Methode nur im angemeldeten Zustand. Ist der PC also gesperrt hängt sich die Suche im externen Programm auf:-(

    Gibt es eine Möglichkeit alle offenen Fehlermeldungen bzw. Infofenster auszulesen und zu bestätigen - im gesperrten Anmeldezustand???

    Brauch eure Hilfe!?!?!

    LG
    Klingt nicht sehr gut.
    Kannst Du nicht dafür sorgen, dass das Programm was von Dir verfasstes findet, wenn es sonst nichts findet?
    Das wäre dann eine Kennung für Nicht gefunden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo RodFromGermany,

    so richtig verstehe ich dich nicht:-) der Timer läuft auch 12 mal durch - sollte dann nix mehr passiert sein bzw. das externe Fremdprog noch offen sein - gibt es einen Taskkill für das externe Programm. Eine Variante wäre nach jedem fehlgeschlagender Suche einen Taskkill durchzuführen und das nächste Makro zuu starten. Aber ich glaube das bei einem Taskkill - quasi wenn ich das externe prog zwangsschließe - ich dieses nicht im nächsten Befehl wieder aufbekomme oder?

    Mist - dachte es gibt nen simplen weg......

    LG

    MSB2000 schrieb:

    Ist in dem externen Fremdprogramm die Suche erfolglos erscheint eine Fehlermeldung: Keine passenden Suchergebnisse!
    Dieses Fenster ist mit OK zu bestätigen.
    Wenn er was findet, kommt das Fenster nicht.
    Das war mein Ziel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Naja das externe Programm findet ja meistens was - deswegen läuft das tool nur wenn das externe etwas findet. aber sobald eine suchanfrage fehlschlägt - Fehlermeldung bzw. Infofenster von dem externen Programm!
    Und der PC ja im Anmeldemodus steht funzt SENDKEYS nicht.

    Am besten man könnte alle Titel der offenen Fenster auslesen und dieses bestimmte dann closen?!

    Und die Fehlermeldung kommt nur bei erfolglosen suchen - sonst nicht....

    LG

    MSB2000 schrieb:

    Am besten man könnte alle Titel der offenen Fenster auslesen und dieses bestimmte dann closen?!

    Das geht problemlos, mit API.
    Such mal im Forum nach EnumWindows und Co, da gibt es unheimlich viel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jupp hab was. Allerdings weiß ich jetzt net wie ich das Fenster bzw die Meldung schließen kann??

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' Unmanaged API Deklarationen / Structures
    3. Class Win32API
    4. '------------------------------------------
    5. '-- API Deklarationen ---
    6. '------------------------------------------
    7. ' API Deklarationen
    8. Public Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As Win32Callback, ByVal lParam As IntPtr) As IntPtr
    9. Public Declare Function GetDesktopWindow Lib "user32" () As IntPtr
    10. Public Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    11. Public Declare Auto Function GetWindowText Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer
    12. '------------------------------------------
    13. '-- Delegates ---
    14. '------------------------------------------
    15. Public Delegate Function Win32Callback(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As Boolean
    16. End Class
    17. Private Function enumWindowsProc(ByVal hWnd As IntPtr, ByVal lpParam As IntPtr) As Boolean
    18. Dim len As Integer
    19. ' get Title
    20. Dim title As String = Space(255)
    21. len = Win32API.GetWindowText(hWnd, title, 255)
    22. title = title.Substring(0, len)
    23. ' get className
    24. Dim className As String = Space(255)
    25. len = Win32API.GetClassName(hWnd, className, 255)
    26. className = className.Substring(0, len)
    27. ' format output
    28. Dim formattedOutput As String = String.Format("{0,-10} {1,-50} {2} ", hWnd, className, title)
    29. Trace.WriteLine(formattedOutput)
    30. If title = "Titel der Fehlermeldung vom Externen Programm" Then
    31. ' was soll ich jetzt tun????
    32. End If
    33. ' next
    34. Return True
    35. End Function
    36. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    37. ' nur child windows vom Desktop abfragen
    38. Win32API.EnumChildWindows(Win32API.GetDesktopWindow, AddressOf enumWindowsProc, Nothing)
    39. End Sub
    40. End Class
    Wenn Du das Fenster identifiziert hast, sende per

    VB.NET-Quellcode

    1. API.SendMessage(FENSTER_HANDLE, WM_CLOSE, 0, 0)
    Das WM_CLOSE musste mal suchen.
    ---------------
    #define WM_CLOSE 0x0010

    VB.NET-Quellcode

    1. Const WM_CLOSE As Integer = &H10
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ohne Garantie:

    VB.NET-Quellcode

    1. If title = "Titel der Fehlermeldung vom Externen Programm" Then
    2. SendMessage(hWnd, WM_CLOSE, 0, 0)
    3. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    SendMessage steht mir gar nicht zur verfügung - obwohl ich dieses nochmal zusätzlich als Funktion hab?! Ich begreif das nicht:-(

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' Unmanaged API Deklarationen / Structures
    3. Class Win32API
    4. '------------------------------------------
    5. '-- API Deklarationen ---
    6. '------------------------------------------
    7. ' API Deklarationen
    8. Public Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As Win32Callback, ByVal lParam As IntPtr) As IntPtr
    9. Public Declare Function GetDesktopWindow Lib "user32" () As IntPtr
    10. Public Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    11. Public Declare Auto Function GetWindowText Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer
    12. Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Long
    13. '------------------------------------------
    14. '-- Delegates ---
    15. '------------------------------------------
    16. Public Delegate Function Win32Callback(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As Boolean
    17. End Class
    18. Private Function enumWindowsProc(ByVal hWnd As IntPtr, ByVal lpParam As IntPtr) As Boolean
    19. Dim len As Integer
    20. ' get Title
    21. Dim title As String = Space(255)
    22. len = Win32API.GetWindowText(hWnd, title, 255)
    23. title = title.Substring(0, len)
    24. ' get className
    25. Dim className As String = Space(255)
    26. len = Win32API.GetClassName(hWnd, className, 255)
    27. className = className.Substring(0, len)
    28. ' format output
    29. Dim formattedOutput As String = String.Format("{0,-10} {1,-50} {2} ", hWnd, className, title)
    30. Trace.WriteLine(formattedOutput)
    31. If title = "AR System User - Warnung" Then
    32. MsgBox("gefunden")
    33. ' !!!!!!!!!! Hier hänge ich total und komme nicht weiter:-(
    34. End If
    35. ' next
    36. Return True
    37. End Function
    38. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    39. ' nur child windows vom Desktop abfragen
    40. Win32API.EnumChildWindows(Win32API.GetDesktopWindow, AddressOf enumWindowsProc, Nothing)
    41. End Sub
    42. End Class
    Die Deklaration ist falsch:

    VB.NET-Quellcode

    1. Public Declare Function SendMessage(...)
    Such Dir mal die richtige .NET-Deklaration.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hab das ganze nàmlich in win 7 geschrieben und auf einer virtuellen serverbüchse mit xp läuft das tool. Ich habe den wert allerdings nicht als const deklariert, sondern direkt den wert - liegt das vielleicht daran?

    Den fenstertilel erkennt er - nur das fenster ansprechen tut er unter xp nicht - win7 ja.

    VB.NET-Quellcode

    1. If title = "AR System User - Warnung" Then
    2. SendMessage(hWnd,&H10 , 0, 0)
    3. End If


    LG

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MSB2000“ ()

    Das mit 0x10 / WM_CLOSE ist egal.
    Läuft es unter XP, wenn Du nicht gesperrt bist?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nee leider nicht. Hab die Funktion auf einen Button gelegt. Unter Win 7 wird das Meldefenster geschlossen. Beim XP leider nicht.

    Hab auch nochmal die Titel auslesen lassen, weil ich gedacht hatte, dass der Titel anders ausgelesen wird. Aber hat den selben Titel wie in Win7. Nur das schließen funzt unter xp nicht.

    LG
    Poste mal bitte den Code, mit dem Du unter XP den Fensternamen testest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist der Code zum testen - dieser ist aber auch in dem eigentlichen Prog implementiert.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Integer, ByVal lParam As Integer) As Long
    3. ' Unmanaged API Deklarationen / Structures
    4. Class Win32API
    5. Public Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As Win32Callback, ByVal lParam As IntPtr) As IntPtr
    6. Public Declare Function GetDesktopWindow Lib "user32" () As IntPtr
    7. Public Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    8. Public Declare Auto Function GetWindowText Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer
    9. Public Delegate Function Win32Callback(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As Boolean
    10. End Class
    11. Private Function enumWindowsProc(ByVal hWnd As IntPtr, ByVal lpParam As IntPtr) As Boolean
    12. Dim len As Integer
    13. ' get Title
    14. Dim title As String = Space(255)
    15. len = Win32API.GetWindowText(hWnd, title, 255)
    16. title = title.Substring(0, len)
    17. ' get className
    18. Dim className As String = Space(255)
    19. len = Win32API.GetClassName(hWnd, className, 255)
    20. className = className.Substring(0, len)
    21. ' format output
    22. Dim formattedOutput As String = String.Format("{0,-10} {1,-50} {2} ", hWnd, className, title)
    23. Trace.WriteLine(formattedOutput)
    24. If title = "AR System User - Warnung" Then
    25. SendMessage(hWnd, &H10, 0, 0)
    26. End If
    27. ' next
    28. Return True
    29. End Function
    30. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    31. Win32API.EnumChildWindows(Win32API.GetDesktopWindow, AddressOf enumWindowsProc, Nothing)
    32. End Sub
    33. End Class