Taste soll 10Sek Gedrückt bleiben

  • Ersteller Ersteller KeySLo
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
K

KeySLo

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 :-).
 
Also die Taste soll 10Sek Gedrückt bleiben und wenn die Taste in 10Sek Endet kommt die nächste Taste.
 
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.
 
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.
 
@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 ;)
 
Ich kenne keine API, mit der ich Tasten auf einer Tastatur drücken kann ...
(Es sei denn ich nehme mein LEGO-Mindstorms :))
Ofensichtlich habe ich das Problem immer noch nicht verstanden.
Dann lasse ich mal jannik93 machen und lese weiter mit.
 
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:(
 
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:
Code:
while(GetMessage(&msg, 0, 0, 0))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

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.
 
ok danke für die antwort:)
/close
 
Status
Für weitere Antworten geschlossen.

Beliebte Schlagwörter

Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.

Zurück
Oben Unten