none
SendKeys benutzen fuer externes program RRS feed

  • Frage

  • hallo leute,

     

    ich habe eine kleine frage mit einem problem dran.

     

    ich bin momentan an einem kleinen program am arbeiten.

    ablauf des program:

    1 Externes program aufrufen (oeffnen) kein problem

    2 buchstaben an das geoefnete program schicken (da ist mein Problem)

    3 Externes program schliesen

    4 24 std warten gehe zu pos 1

     

    warum das denn,

    ich habe einen rechner der mit xp bespielt ist, der aber auch als server fuer ein programm benutzt wird, zugleich ist der rechner in ein reck

    verbaut und mit einer tuer verschlossen. das grosse problem ist jetzt, das server program hat eine liz, das hat zufolge bin 30 tagen muss min 1 mal das program aufgerufen werden und der admin muss sich da anmelden. tut er es nicht in dem zeit raum werden die clients und der zugang vom program blockiert, dies kann den nur von einem service techniker mit einem super pin wieder freigeschaltet werden (Kosten). um diese kosten ewig zuvermeiden, habe ich mir das kleine program ein fallen lassen. nur das problem ist momentan nur mit dem schicken der buchstaben.

    ich danke allen die mir bei dem kleinem problem helfen koennen.

     

    Sonntag, 22. August 2010 22:30

Antworten

  • Hallo Dietmar,

    was genau ist dein Problem bzw. wo schlägt dein Versuch Fehl? Hast du eine Fehlermeldung? Es wäre auch hilfreich wenn du deinen Code posten könntest zu Punkt 2.

    An Sich ist das ja nichts komplexes die SendKeys methode zu benutzen, man muss lediglich darauf achten, dass das Fenster an das man die Zeichen senden will auch aktiv ist (den Fokus hat). Das bekommt man mit den Funktionen FindWindow und SetForegroundWindow .

    Ein schönes Tutorial kannst su dir auch hier anschauen:

    Steuern von Drittprogrammen mit Hilfe der SendKeys-Methode
    http://www.activevb.de/tutorials/tut_sendkeys/sendkeys.html

    SendKeys Klasse bei MSDN
    http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx

    Wie gesagt, wär es hilfreich wenn du deinen Code, der nicht funktioniert mal posten könntest, dann kann man die auch besser helfen.

    MfG, Sebastian Gross
    Montag, 23. August 2010 05:44
  • Hi,

    1 Externes program aufrufen (oeffnen) kein problem

    2 buchstaben an das geoefnete program schicken (da ist mein Problem)

    3 Externes program schliesen

    was genau ist denn bei Punkt 2 das Problem? Wenn Du das Programm geöffnet hast, müsstest Du, wenn Du eine Eingabe machen willst, natürlich noch den Cursor ins entsprechende Eingabefeld bewegen. Probier doch einfach mal, wie viel "Tabs" Du manuell drücken musst, bis Du im gewünschten Feld bist. Diese Anzahl Tabs {TAB} sein) solltest Du dann vor dem senden der Buchstaben noch an an das Programm schicken.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Montag, 23. August 2010 06:50
    Moderator
  • Hallo Dietmar 74,

     

    offen gestanden habe ich dein Problem auch nicht ganz nachvollziehen können.

    Dennoch hier ein Code, der beim Start den Editor (als Beispielprogramm öffnet) und dort „Dies ist ein Test“ reinschreibt.

    Wenn es also nur dein Problem ist, in ein bestimmtes Eingabefeld einen Anmeldecode einzugeben, please feel free to modify the code:

     

    Public Class Form1

        ' Get a handle to an application window.

        Declare Auto Function FindWindow Lib "USER32.DLL" ( _

            ByVal lpClassName As String, _

            ByVal lpWindowName As String) As IntPtr

     

        ' Activate an application window.

        Declare Auto Function SetForegroundWindow Lib "USER32.DLL" _

            (ByVal hWnd As IntPtr) As Boolean

     

     

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            'Anwendung  muss bereits gestartet sein !!! Nicht erst hier starten

     

            '//Fenster suchen

     

            Dim myHandle As IntPtr = FindWindow("Notepad", "Unbenannt - Editor") '//Hier mit dem beliebiegen Fenstername austauschen

            ' Verify that Calculator is a running process.

     

            If myHandle = IntPtr.Zero Then

                MsgBox("Notepad nicht gestartet")

                Return

            End If

     

            ' Setzt die Anwendung in den Vordergrund und gibt die Werte ein

            SetForegroundWindow(myHandle)

            SendKeys.SendWait("111")

            SendKeys.SendWait("*")

            SendKeys.SendWait("11")

            SendKeys.SendWait("=")

        End Sub

     

     

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            SetForegroundWindow(RichTextBox1.TextLength)

            RichTextBox1.Focus()

            SendKeys.SendWait("111")

            SendKeys.SendWait("*")

            SendKeys.SendWait("11")

            SendKeys.SendWait("=")

            SendKeys.Send("A")

            'SendKeys.Send("^{x}")

            SendKeys.Send("{ENTER}")

            SendKeys.Send("{ENTER}")

            SendKeys.Send("Ende")

     

     

        End Sub

     

        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

            SendKeys.SendWait("%{D}")

        End Sub

     

        Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

            SendKeys.SendWait("%{P}")

        End Sub

     

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Process.Start("C:\WINDOWS\notepad.exe")

            Timer1.Enabled = True

        End Sub

     

        Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

            Process.Start("C:\WINDOWS\notepad.exe")

        End Sub

     

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

            Timer1.Interval = 200

            Timer1.Enabled = True

            Dim myHandle As IntPtr = FindWindow("Notepad", "Unbenannt - Editor") '//Hier mit dem beliebiegen Fenstername austauschen

            'SendKeys.Send("^{x}")

            SendKeys.SendWait("D")

            SendKeys.SendWait("A")

            SendKeys.SendWait("S")

            SendKeys.Send(" ")

            SendKeys.SendWait("I")

            SendKeys.SendWait("S")

            SendKeys.SendWait("T")

            SendKeys.Send("{ENTER}")

            SendKeys.SendWait("ein")

            SendKeys.Send(" ")

            SendKeys.Send("Test")

            SendKeys.Send("{ENTER}")

            SendKeys.Send("Ende")

        End Sub

     

        Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing

     

        End Sub

    End Class


    Liebe Grüße Stefan
    Samstag, 28. August 2010 00:40

Alle Antworten

  • Hallo Dietmar,

    was genau ist dein Problem bzw. wo schlägt dein Versuch Fehl? Hast du eine Fehlermeldung? Es wäre auch hilfreich wenn du deinen Code posten könntest zu Punkt 2.

    An Sich ist das ja nichts komplexes die SendKeys methode zu benutzen, man muss lediglich darauf achten, dass das Fenster an das man die Zeichen senden will auch aktiv ist (den Fokus hat). Das bekommt man mit den Funktionen FindWindow und SetForegroundWindow .

    Ein schönes Tutorial kannst su dir auch hier anschauen:

    Steuern von Drittprogrammen mit Hilfe der SendKeys-Methode
    http://www.activevb.de/tutorials/tut_sendkeys/sendkeys.html

    SendKeys Klasse bei MSDN
    http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx

    Wie gesagt, wär es hilfreich wenn du deinen Code, der nicht funktioniert mal posten könntest, dann kann man die auch besser helfen.

    MfG, Sebastian Gross
    Montag, 23. August 2010 05:44
  • Hi,

    1 Externes program aufrufen (oeffnen) kein problem

    2 buchstaben an das geoefnete program schicken (da ist mein Problem)

    3 Externes program schliesen

    was genau ist denn bei Punkt 2 das Problem? Wenn Du das Programm geöffnet hast, müsstest Du, wenn Du eine Eingabe machen willst, natürlich noch den Cursor ins entsprechende Eingabefeld bewegen. Probier doch einfach mal, wie viel "Tabs" Du manuell drücken musst, bis Du im gewünschten Feld bist. Diese Anzahl Tabs {TAB} sein) solltest Du dann vor dem senden der Buchstaben noch an an das Programm schicken.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Montag, 23. August 2010 06:50
    Moderator
  • Hallo Dietmar 74,

     

    offen gestanden habe ich dein Problem auch nicht ganz nachvollziehen können.

    Dennoch hier ein Code, der beim Start den Editor (als Beispielprogramm öffnet) und dort „Dies ist ein Test“ reinschreibt.

    Wenn es also nur dein Problem ist, in ein bestimmtes Eingabefeld einen Anmeldecode einzugeben, please feel free to modify the code:

     

    Public Class Form1

        ' Get a handle to an application window.

        Declare Auto Function FindWindow Lib "USER32.DLL" ( _

            ByVal lpClassName As String, _

            ByVal lpWindowName As String) As IntPtr

     

        ' Activate an application window.

        Declare Auto Function SetForegroundWindow Lib "USER32.DLL" _

            (ByVal hWnd As IntPtr) As Boolean

     

     

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            'Anwendung  muss bereits gestartet sein !!! Nicht erst hier starten

     

            '//Fenster suchen

     

            Dim myHandle As IntPtr = FindWindow("Notepad", "Unbenannt - Editor") '//Hier mit dem beliebiegen Fenstername austauschen

            ' Verify that Calculator is a running process.

     

            If myHandle = IntPtr.Zero Then

                MsgBox("Notepad nicht gestartet")

                Return

            End If

     

            ' Setzt die Anwendung in den Vordergrund und gibt die Werte ein

            SetForegroundWindow(myHandle)

            SendKeys.SendWait("111")

            SendKeys.SendWait("*")

            SendKeys.SendWait("11")

            SendKeys.SendWait("=")

        End Sub

     

     

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            SetForegroundWindow(RichTextBox1.TextLength)

            RichTextBox1.Focus()

            SendKeys.SendWait("111")

            SendKeys.SendWait("*")

            SendKeys.SendWait("11")

            SendKeys.SendWait("=")

            SendKeys.Send("A")

            'SendKeys.Send("^{x}")

            SendKeys.Send("{ENTER}")

            SendKeys.Send("{ENTER}")

            SendKeys.Send("Ende")

     

     

        End Sub

     

        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

            SendKeys.SendWait("%{D}")

        End Sub

     

        Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

            SendKeys.SendWait("%{P}")

        End Sub

     

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Process.Start("C:\WINDOWS\notepad.exe")

            Timer1.Enabled = True

        End Sub

     

        Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

            Process.Start("C:\WINDOWS\notepad.exe")

        End Sub

     

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

            Timer1.Interval = 200

            Timer1.Enabled = True

            Dim myHandle As IntPtr = FindWindow("Notepad", "Unbenannt - Editor") '//Hier mit dem beliebiegen Fenstername austauschen

            'SendKeys.Send("^{x}")

            SendKeys.SendWait("D")

            SendKeys.SendWait("A")

            SendKeys.SendWait("S")

            SendKeys.Send(" ")

            SendKeys.SendWait("I")

            SendKeys.SendWait("S")

            SendKeys.SendWait("T")

            SendKeys.Send("{ENTER}")

            SendKeys.SendWait("ein")

            SendKeys.Send(" ")

            SendKeys.Send("Test")

            SendKeys.Send("{ENTER}")

            SendKeys.Send("Ende")

        End Sub

     

        Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing

     

        End Sub

    End Class


    Liebe Grüße Stefan
    Samstag, 28. August 2010 00:40
  • Hallo Dietmar74,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Montag, 30. August 2010 14:02
    Moderator