Send Keys funktioniert nicht immer

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Send Keys funktioniert nicht immer

    Guten tag zusammen,

    Ich habe da ein kleines problem. ich arbeite zur zeit mit den sendkeys, es sollen 2 unabhängige programme damit gesteuert werden.
    einfache linksklicks mit der maus+positionierung reichen dafür aus. ich muss bei beiden programmen in einem gewissen ablauf 2 buttons anklicken.
    nun habe ich folgendes problem: bei einem programm funktioniert es, bei dem anderen programm nicht. man sieht das die maus korrekt positioniert wird, es wird wie es scheint auch geklickt(bei positionsänderung auf das andere programm funktioniert es) aber es passiert einfach nichts.
    hat vllt jemand ahnung woran das liegen könnte?


    hier ist ein ausschnitt meines codes:

    Ich hab keine Ahnung ob es etwas damit zutun haben könnte aber das nicht funktionierende Programm ist schon etwas älter und baut vermutlich auf das 3.5 net framework auf.
    Betriebssystem: Windows 7


    VB.NET-Quellcode

    1. Windows.Forms.Cursor.Position = New Point(AbbruchX + 50, AbbruchY + 40)
    2. System.Threading.Thread.Sleep(200)
    3. SendMausklick(MOUSE_LEFT)


    *Topic verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Julia89 schrieb:

    es passiert einfach nichts
    Das könnte daran liegen, dass das SendKeys ins Nirwana geht.
    SendKeys sendet an das Fenster mit dem Fokus. Falls Dein Zielfenster nicht den Fokus hat, geht nix.
    Vielleicht denkst Du mal drüber nach, Deine Ziel-App "richtig" fernzusteuern. Gugst Du hier.
    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, danke du für deine Antwort.
    Etwas verstehe ich aber noch nicht. Wenn ich das Programm händisch anklicke kommt es ja in den Fokus, oder ist damit was anderes gemeint. Außerdem verstehe ich auch nicht wieso es bei allen anderen (getesteten) Programmen funktioniert nur dort nicht. Könntest du mir das vllt näher erklären? Möchte die Thematik einfach verstehen.

    Julia89 schrieb:

    ist damit was anderes gemeint
    Nein.
    Was ist da zu erklären?
    Starte Dein Programm, sorge dafür, dass das Sendkeys zeitverzögert beginnt (z.B. mit nem Timer) und gib dem anderen Programm / Fenster den Fokus (drauf klicken).
    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!
    Also genau das mache ich aktuell ja. Das Programm ist im fordergrund. Dann setzt mein Timer von 200ms ein. Dann kommt der klick. Um sicher zu gehen wiederhole ich das ganze mit einer geringfügigen neupositionierun
    Man sieht auch das der Button "angewählt" wird. Aber es löst die Funktion des programmes trotzdem nicht aus.
    Wie schon geschrieben,bei anderen Programmen funktioniert es.
    hallo nochmal,
    @RodFromGermany
    ich habe mir deinen link angeschaut und das sieht vielversprechend aus.
    nur leider bin ich was meine programmierkünste in vb.net angeht recht eingeschränkt, geschweige denn das ich mir "ohne weiteres" einen code der in c# geschrieben ist herleiten könnte.

    ich habe jetzt etwas rumprobiert und schon mal folgendes geschrieben:

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True)> _
    2. Private Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr
    3. End Function
    4. <DllImport("user32.dll")> _
    5. Private Shared Function SetForegroundWindow(hWnd As IntPtr) As Boolean
    6. End Function


    wenn ich jetzt meinen code anwende und die maus wieder über den button positioniere und anschließend den klick ausführe passiert bei dem programm noch immer nichts.

    VB.NET-Quellcode

    1. Dim hWnd As IntPtr = FindWindow(Nothing, "Programm")
    2. SetForegroundWindow(hWnd)
    3. Windows.Forms.Cursor.Position = New Point(StartX1 + 51, StartY1 + 41)
    4. System.Threading.Thread.Sleep(200)
    5. SendMausklick(MOUSE_LEFT)


    mit "SetForegroundWindow" müsste es doch dann definitiv den fokus haben, oder?
    ich meine, ich sehe ja auch das es in den fordergrund geholt wird, selbst der button wird dann durch den klick angewählt (sieht man an dem gestrichelten rahmen).
    nur leider startet das programm nicht.

    ich habe mir wie gesagt deinen link angeschaut und würde auch gerne die buttons direkt ansteuern. nur leider verstehe ich was das angeht(auch wg c#) nur bahnhof, könntest du mir
    weitere tips, oder ein beispiel geben in vb.net? das wäre sehr nett.

    @Mono
    Es ist keine directx anwendung.

    Julia89 schrieb:

    einen code der in c# geschrieben
    Gugst Du hier.
    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 Zusammen,
    ich habe mich inzwischen eingelesen und bin jetzt schon etwas weiter gekommen. Allerdings funktioniert das klicken noch immer nicht.
    wenn jemand eine idee hat wäre ich sehr dankbar.

    Funktioniert: Textbox anwählen und mit Text füllen
    Button-Text umbennen(auch wenn dann komische zeichen, statt des textes angezeigt werden. war auch nur zum testen)

    Funktioniert nicht: Button anklicken bzw das klickevent ausführen.

    VB.NET-Quellcode

    1. Public Class Messungen_Starten
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. 'Druck Eingeben
    4. Dim Hwnd As Integer = Win32.FindWindow(Nothing, "Prüfstand")
    5. If (Not Hwnd = 0) Then
    6. Dim HwndInfo As Integer = Win32.FindWindowEx(Hwnd, Nothing, "TGroupBox", "Info")
    7. If Not HwndInfo = 0 Then
    8. Dim ccHwnd As Integer = Win32.FindWindowEx(HwndInfo, Nothing, "TPanel", Nothing)
    9. If Not ccHwnd = 0 Then
    10. Dim cccHwnd As Integer = Win32.FindWindowEx(ccHwnd, Nothing, "Tedit", Nothing)
    11. If Not cccHwnd = 0 Then
    12. Win32.SetForegroundWindow(cccHwnd)
    13. Else
    14. MessageBox.Show("Bitte Starte erst die Programme")
    15. End If
    16. Else
    17. MessageBox.Show("Bitte Starte erst die Programme")
    18. End If
    19. Else
    20. MessageBox.Show("Bitte Starte erst die Programme")
    21. End If
    22. Win32.SetForegroundWindow(HwndInfo)
    23. SendKeys.Send("999")
    24. Else
    25. MessageBox.Show("Bitte Starte erst die Programme")
    26. End If
    27. 'Startbutton Klicken
    28. Dim HwndFunktion As Integer = Win32.FindWindowEx(Hwnd, Nothing, "TGroupBox", "Funktion")
    29. If Not HwndFunktion = 0 Then
    30. Dim cHwnd As Integer = Win32.FindWindowEx(HwndFunktion, Nothing, "TButton", "S T A R T")
    31. If Not cHwnd = 0 Then
    32. Win32.SetForegroundWindow(cHwnd)
    33. Win32.SendMessage(cHwnd, Win32.WM_SETFOCUS, 0, 0)
    34. Win32.SendMessage(cHwnd, Win32.WM_NCLBUTTONDBLCLK, 0, 0)
    35. Win32.SendMessage(cHwnd, Win32.WM_NCLBUTTONDBLCLK, 0, 0)
    36. Win32.SendMessage(cHwnd, Win32.WM_NCLBUTTONDOWN, 0, 0)
    37. Win32.SendMessage(cHwnd, Win32.WM_SETTEXT, 0, "6")
    38. Else
    39. MessageBox.Show("Bitte Starte erst die Programme")
    40. End If
    41. Else
    42. MessageBox.Show("Bitte Starte erst die Programme")
    43. End If
    44. End Sub
    45. End Class


    nicht wundern, ich hab schon einige konstanten ausprobriert, deswegen stehen die noch alle im code

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

    Julia89 schrieb:

    MessageBox.Show("Bitte Starte erst die Programme")
    Starte die Programme selber, da weißt Du sicher, dass sie da sind.
    Wenn SendMessage() an ein n icht vorhandenes Fenster sendet, passiert nix.
    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!

    Julia89 schrieb:

    noch immer nicht funktioniert
    lerne zu debuggen. Gugst Du hier.
    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!
    Gabs da nicht mal was mit den ID's der einzelnen Elemente in einer Form... Hab ich irgendwo hier im Form mal was drüber gelesen glaub ich... Evtl. könnte das Hilfreich sein um das gewünschte Element zu bedienen. Denn wenn Die Fensterposition anders ist, geht der Klick aus ins leere.
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!