Taste soll 10Sek Gedrückt bleiben

  • VB

  • KeySLo
  • 2186 Aufrufe 14 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Taste soll 10Sek Gedrückt bleiben

    Hi,
    Ich möchte mal ein Timer einstellen z.b die Taste 1 soll 10Sek gedrückt werden welchen Code brauch ich dafür?:confused:

    Ich hab es so versucht::löl:

    Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Timer1.Enabled = True
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Timer1.Interval = Val(NumericUpDown1.Value)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Timer1.Enabled = False
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    SendKeys.Send(TextBox1.Text)
    SendKeys.Send("{1}")
    End Sub
    End Class

    Also die Taste soll 10Sek Gedrückt bleiben und wenn die Taste in 10Sek Endet kommt die nächste Taste.
  • Mag sein, dass es an der Uhrzeit liegt, aber ich verstehe gar nix.
    Was soll das Programm denn tun?

    Soll es einen Tastendruck simulieren, der 10 sec dauert?
    Soll es einen Timer auf 10 sec stellen?
    Soll es prüfen, ob eine Taste 10 sec gedrückt wurde?

    Die Spezifikation muss schon etwas genauer sein :-).
  • das problem bei deinem obigen Code ist, dass der Timer halt immer in intervallen aufgerufen wird, wie die Eigenschaft Timer1.Interval es ja schon andeutet.
    ich weiss zwar nicht was der Effekt des Programms/Tastendrucks sein soll, aber mit dem Timer kann keinen "Dauerdruck" der Taste simuliert werden.
    Wahrscheinlich musst du mit der SetKeyboardState API-Funktion arbeiten, die in einer Endlosschleife (für 10 Sekunden) jedes mal aufgerufen wird.

    Du kannst ja mal schreiben wozu das überhaupt dienen soll, vlt kann man das Problem auf anderem Wege lösen.
    Wo ist Iphigenie?
  • Ich weiß zwar nicht genau, wie es geht, aber hier ein Ansatz:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Timer1.Enabled = True
    End Sub


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

    Timer1.Interval = "1000"
    Dim Time as String = 10
    time = time - 1 'Zählt von 10 auf 0 runter
    Label6.Text = time

    If time = 0 then 'Wenn 0 dann
    time = 10
    .... 'Irgendwas jetzt, weiß noch nicht, ich überlege gerade
    End If

    End Sub
  • Also wenn ich das richtig verstehe, dann muss man sich in die Message-Queue einhängen.
    Damit kann dem System ein explizites keyDown und KeyUp Event untergeschoben werden.
    Es gibt ein nette Beispiel auf "CodeProject".
    Hier der Link: CodeProject: Global System Hooks in .NET. Free source code and programming help
    Es ist aber kein triviales Thema...
    So häufig musste ich mein Rechner noch nie rebooten, als wie in der Zeit in der ich mich mit dem Thema beschäftigt hatte.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von wasawasa ()

  • @wasawasa
    Das mein ich nicht;)
    ich möchte nur das mein Keyboard das die Taste 1 für 10.sek gedrückt bleibt danach wenn sie in 10sek. endet kommt die nächste Taste
    @jannik93
    jannik93 ich glaub er weiß wie ich das mein:)
    das Code was du mir es gepostet hast braucht nur die letzten Code:(
  • ja, das ist ja das Problem, ich kenn mich nicht mit der API oder ähnlichem aus, die das gedrückthalten "macht"...

    Eine Frage, wieviele Tasten sind das denn? Und fängt das irgendwann nochmal von vorne an? Also z.B.:

    Taste 1 - 10 Sek
    Taste 2 - 10 Sek
    Taste 3 - 10
    Taste 4 - ""
    Taste 5 - ""
    Taste 1 - 10 Sek
    Taste 2 - 10 Sek
    Taste 3 - 10 Sek
    ...


    Und müssen die unbedingt gedrückt bleiben, oder gehen auch ganz kleine Abstände dazwischen?

    Ich weiß schon wie ich es machen kann, ich brauche nur eine Function/API/Sonstiges zum gedrückt halten und die Frage oben muss ich beantwortet haben ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Jannik ()

  • Es müssen mehrere tasten laufen also wenn ich mein tool erstelle habe hat es ein "Start" Button und wenn ich das start Button geklickt hab wird die taste EINS 10 sek. gedrückt danach wird die taste ZWEI 10sek. gedrückt dann taste 3,4,5,6...usw

    genau wie das beispiel gemacht hast:)
  • also wiederholt sich das dauernt?

    Ich habe z.B. hier einen Code, weiß nicht, ob das schon perfekt für dich ist, eigenlich ganz simpel:

    Public Class Form1
    Dim Time As String = 50

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Timer1.Enabled = True
    Timer2.Enabled = True
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Timer1.Interval = 1000
    Time = Time - 1 'Zählt von 10 auf 0 runter
    Label6.Text = Time
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    Timer2.Interval = 100
    If Time >= 40 And Time <= 50 Then
    SendKeys.Send("A")
    ElseIf Time >= 30 And Time <= 40 Then
    SendKeys.Send("B")
    ElseIf Time >= 20 And Time <= 30 Then
    SendKeys.Send("C")
    ElseIf Time >= 10 And Time <= 20 Then
    SendKeys.Send("D")
    ElseIf Time >= 0 And Time <= 10 Then 'Wenn 0 dann
    SendKeys.Send("E")
    'Irgendwas jetzt, weiß noch nicht, ich überlege gerade
    ElseIf Time = 0 Then
    Time = 100
    End If
    End Sub
    End Class


    Und hier die Source:


    Mal gucken, ob du das so meinst ;)
  • Jaaa genau das aber irgend wie bleiben die tasten nicht dauer 10sek. gedrückt ;)
    die taste gibt immer AAAAAAA:(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von KeySLo ()

  • Ich muss mich hier noch mal melden.
    Aus meiner Sicht löst SendKeys die Aufgabe nicht.
    Aber ich kann auch falsch liegen, da ich das Problem noch immer nicht ganz verstehe.

    Ich hänge hier noch meine Begründung für meine Aussage an:

    Wie verarbeitet Windows Meldungen, die in seiner Message-Queue einlaufen?
    Der Standard-Verarbeitungs-Zyklus von Meldungen sieht für gewöhnlich folgendermaßen aus:

    Quellcode

    1. while(GetMessage(&msg, 0, 0, 0))
    2. {
    3. TranslateMessage(&msg);
    4. DispatchMessage(&msg);
    5. }


    Mit Hilfe der Funktion GetMessage werden die Tastaturereignisse aus der Queue gezogen und mittels der Funktion DispatchMessage in eine Fensterroutine weitergeleitet, die die Meldungen für das Fenster bearbeitet, wo im gegebenen Augenblick der Input-Fokus konzentriert ist. Der Input-Fokus ist ein von der Anwendung oder von Windows erzeugtes Attribut, das dem Fenster hinzugefügt werden kann. Verfügt ein Fenster über einen Input-Fokus, empfängt die entsprechende Funktion dieses Fensters alle Tastaturmeldungen aus der System-Queue. Anwendungen können den Input-Fokus von einem Fenster zu einem anderen weiterreichen, wie etwa beim Wechsel von einer Anwendung zur anderen mit Hilfe der Tastenkombination Alt+Tab.

    Noch vor der Funktion DispatchMessage wird für gewöhnlich die Funktion TranslateMessage ausgelöst, die auf der Grundlage der Meldungen WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP die „symbolischen“ Meldungen WM_CHAR, WM_SYSCHAR, WM_DEADCHAR und WM_SYSDEADCHAR generiert. Diese symbolischen Meldungen reihen sich in die Message-Queue der Anwendung ein, wobei die originalen Tastatur-Meldungen nicht aus der Queue gelöscht werden.

    Um das 10sec drücken einer Taste zu simulieren, muss man WM_KEYDOWN und WM_KEYUP eben im Abstand von 10sec senden. Das tut SendKeys (meiner Meinunge nach) nicht. Genau erklärt ist es auf der Webseite, die ich schon gepostet habe.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von wasawasa ()