Hilfe:-( Externen Button Betätigen

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Hilfe:-( Externen Button Betätigen

    Hi Leute,

    ich habe ein kleines Tool welches zu bestimmten Zeiten eine Excel startet und Makros ausführt. Das USerprofil ist so begrenzt - das ich die Makrosicherheit in Excel nicht runternehmen kann - Aber EXE Dateien ablegen darf:-)

    Nun Ja es kommt halt immer diese Meldung - im Anhang.

    Ich wollte mal testen ob ich "Makros ausführen" in meinem Tool einbauen kann. Allerdings passiert nix:-(


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    3. Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
    4. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    5. Private Const BM_CLICK As Integer = &HF5
    6. Private iHwndForm As IntPtr 'Fensterhanlde ermitteln
    7. Private iHwndButton As IntPtr 'Buttonhandle ermitteln
    8. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    9. 'Fenster Handle ermitteln
    10. iHwndForm = FindWindow(vbNullString, "Makros aktivieren")
    11. 'Button Handle ermitteln
    12. iHwndButton = FindWindowEx(iHwndForm, 0, "Button", vbNullString)
    13. 'Click auf Button in zweite EXE senden
    14. SendMessage(iHwndButton, BM_CLICK, 0, 0) 'Button drücken
    15. End Sub
    16. End Class


    Kann mir jemand helfen?

    VG
    Bilder
    • Unbenannt.png

      6,86 kB, 395×203, 122 mal angesehen
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.
    @MSB2000 Zum Fernsteuern von anderen Programmen gugst Du mal diesen Thread.
    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!
    Ich sehe ein, dass Du in dieser kurzen Zeit die Problematik weder verstanden noch verinnerlicht haben kannst.
    Fang an mit nem kleinen Testprogramm.
    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 jetzt mit SPY++ den Klassennamen geben lassen: bosa_sdm_XL9.

    Und wie folgt versucht den Button klicken zu lassen - ohne Erfolg:-(

    VB.NET-Quellcode

    1. 'Fenster Handle ermitteln
    2. iHwndForm = FindWindow(vbNullString, "Sicherheitswarnung")
    3. 'Button Handle ermitteln
    4. iHwndButton = FindWindowEx(iHwndForm, 0, "bosa_sdm_XL9", vbNullString)
    5. 'Click auf Button in zweite EXE senden
    6. SendMessage(iHwndButton, BM_CLICK, 0, 0) 'Button drücken


    Hat noch jemand eine Idee?
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.

    MSB2000 schrieb:

    Hat noch jemand eine Idee?
    Du musst die Fenster durch-enumerieren, bis Du Deinen Button findest. Er wird immer der n-te in dieser Aufzählung sein.
    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!

    MSB2000 schrieb:

    wie mach ich das?
    gugst Du mal diesen Thread.
    Da kommst Du nicht drum herum.
    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!
    Aber ich möchte doch lediglich einen Button klicken lassen - keine Labels oder Groupbox auslesen. Ich versuche mal deinen C# umgewandelten VB Code.



    Nee den Code verstehe ich nicht im geringsten. Benötige Hilfe dazu...
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.

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

    MSB2000 schrieb:

    Benötige Hilfe dazu...
    Stell konkrete Fragen, dann bekommst Du eine konkrete Antwort.
    Deine Hausaufgaben musst Du allein machen. :/
    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!
    Danke für die tolle Antwort.

    Ich habe ein ixes Tool geschrieben - damit kann ich mir erstmal alle Titel, Klassen und Handles ausgeben lassen. Beim auswählen aus der Listbox kann ich gleich versuchen ob ich den Button klicken kann. Kann erst morgen testen.

    Hier der Code zum Fenster aulesen - bissl schlampig - mussste schnell gehen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Messages As New List(Of String)
    3. Dim AttachArray As New ArrayList
    4. Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    5. Class Win32API
    6. Public Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As Win32Callback, ByVal lParam As IntPtr) As IntPtr
    7. Public Declare Function GetDesktopWindow Lib "user32" () As IntPtr
    8. Public Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    9. Public Declare Auto Function GetWindowText Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer
    10. 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
    11. Public Delegate Function Win32Callback(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As Boolean
    12. End Class
    13. Private Function enumWindowsProc(ByVal hWnd As IntPtr, ByVal lpParam As IntPtr) As Boolean
    14. Dim len As Single
    15. Dim title As String = Space(255)
    16. len = Win32API.GetWindowText(hWnd, title, 255)
    17. title = title.Substring(0, len)
    18. Dim className As String = Space(255)
    19. len = Win32API.GetClassName(hWnd, className, 255)
    20. className = className.Substring(0, len)
    21. Dim formattedOutput As String = String.Format("{0,-10} {1,-50} {2} ", hWnd, className, title)
    22. Trace.WriteLine(formattedOutput)
    23. ListBox1.Items.Add(title)
    24. ListBox2.Items.Add(className)
    25. ListBox3.Items.Add(hWnd)
    26. ListBox4.Items.Add(title)
    27. ListBox5.Items.Add(className)
    28. ListBox6.Items.Add(hWnd)
    29. Return True
    30. End Function
    31. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    32. ListBox1.Items.Clear()
    33. ListBox2.Items.Clear()
    34. ListBox3.Items.Clear()
    35. ListBox4.Items.Clear()
    36. ListBox5.Items.Clear()
    37. ListBox6.Items.Clear()
    38. TextBox1.Text = ""
    39. TextBox2.Text = ""
    40. TextBox3.Text = ""
    41. Win32API.EnumChildWindows(Win32API.GetDesktopWindow, AddressOf enumWindowsProc, Nothing)
    42. End Sub
    43. Private Sub ListBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    44. TextBox1.Text = ListBox1.SelectedItem.ToString
    45. ListBox2.SelectedIndex = ListBox1.SelectedIndex.ToString
    46. TextBox2.Text = ListBox2.SelectedItem.ToString
    47. ListBox3.SelectedIndex = ListBox1.SelectedIndex.ToString
    48. TextBox3.Text = ListBox3.SelectedItem.ToString
    49. End Sub
    50. Private Sub ListBox2_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
    51. TextBox2.Text = ListBox2.SelectedItem.ToString
    52. ListBox1.SelectedIndex = ListBox2.SelectedIndex.ToString
    53. TextBox1.Text = ListBox1.SelectedItem.ToString
    54. ListBox3.SelectedIndex = ListBox2.SelectedIndex.ToString
    55. TextBox3.Text = ListBox3.SelectedItem.ToString
    56. End Sub
    57. Private Sub ListBox3_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox3.SelectedIndexChanged
    58. TextBox3.Text = ListBox3.SelectedItem.ToString
    59. ListBox1.SelectedIndex = ListBox3.SelectedIndex.ToString
    60. TextBox1.Text = ListBox1.SelectedItem.ToString
    61. ListBox2.SelectedIndex = ListBox3.SelectedIndex.ToString
    62. TextBox2.Text = ListBox2.SelectedItem.ToString
    63. End Sub
    64. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    65. Const BM_CLICK As Int32 = &HF5
    66. SendMessage(TextBox3.Text, BM_CLICK, 0, 0)
    67. End Sub
    68. Private Sub TextBox4_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox4.TextChanged
    69. On Error Resume Next
    70. ListBox1.Items.Clear()
    71. ListBox2.Items.Clear()
    72. ListBox3.Items.Clear()
    73. Dim x As Single
    74. Dim y As Single
    75. y = ListBox4.Items.Count
    76. For x = 0 To y
    77. If ListBox4.Items.Item(x).ToString().Contains(TextBox4.Text) Then
    78. ListBox1.Items.Add(ListBox4.Items(x))
    79. ListBox2.Items.Add(ListBox5.Items(x))
    80. ListBox3.Items.Add(ListBox6.Items(x))
    81. End If
    82. If ListBox5.Items.Item(x).ToString().Contains(TextBox4.Text) Then
    83. ListBox1.Items.Add(ListBox4.Items(x))
    84. ListBox2.Items.Add(ListBox5.Items(x))
    85. ListBox3.Items.Add(ListBox6.Items(x))
    86. End If
    87. Next
    88. End Sub
    89. End Class
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.

    MSB2000 schrieb:

    Danke für die tolle Antwort.
    Die Frage dazu könnte lauten:
    Ich habe ein Programm XXX, Screenshot im Anhang, da möchte ich den Button X (rot markiert) von meinem Programm aus drücken. :D

    MSB2000 schrieb:

    mussste schnell gehen.
    Dann schreib dazu, was getan werden muss, um Deinen Code zu testen.




    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!
    Na hab ich doch ;)

    Mein Programm führt zu einer bestimmten Zeit eine Excel-Datei aus (mit selbst startenden Makro). Allerdings sind die Userberechtigung beschränkt, so dass bei jedem Excel Start das Fenster "Makros aktivieren" kommt. Leider kann man die Makro Sicherheit in Excel nicht runtersetzen - fehlende Userberechtigung.
    Sooo - mein Tool soll den Button "Makros aktivieren" drücken.

    Jetzt habe ich ein kleine Testtool geschrieben welches mir erstmal den richtigen Titel, Klasse und Handle gibt mit der Möglichkeit diesen dann zu drücken.
    Wähle ich beispielsweise "Start" aus und den Button "Drücken" - dann drücke ich Windows-Start. So kann ich testen auf welchen Handle ich muss um den eigentlichen Button zu testen - aber erst heute gegen 12:00Uhr auf Arbeit ;)

    hier noch der Sreen vom Testprog.
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.

    RodFromGermany schrieb:

    was getan werden muss,

    MSB2000 schrieb:

    Na hab ich doch
    Leider kann ich das nicht nachvollziehen.
    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!
    Egal funktionierte sowieso nicht - leider...Bekomme keine vernünftige Adresse...aber ein anderer Beitrag von Dir über DGV hat mir geholfen...

    Hab mal geschaut was das Excel Makro eigentlich macht. Es öffnet ein externes Ticket Programm und führt in diesem externem Programm ein Makro aus welches ein Report in einer CSV ablegt. Naja ab jetzt war es einfach - das externe Prog kann ich auch öffnen lassen und mit dem COM Verweis ebenfalls das Makro dieses externen Programms ausführen lassen. Das heißt die CSV Dateien hab ich schonmal. Diese jetzt in einem Datagridview - auswerten - Mail verschicken.

    Danke schön....
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.
    Probier mal dies:

    C#-Quellcode

    1. public const int BM_CLICK = 0xF5;
    2. IntPtr hwnd = FindWindowEx(hwndMain, IntPtr.Zero, "button", "DER TEXT AUF DEM BUTTON");
    3. SendMessage(hwnd, BM_CLICK, IntPtr.Zero, null);

    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!