Tastenkombination

sunflower84

Erfahrenes Mitglied
Hallo

Ich habe einen Countdown. Ich möchte gerne das dieser Countdown per Tastenkombination von vorne anfängt.
Wie mache ich denn das ?

frmTimer:
Code:
Option Explicit

Private Declare Function ExitWindowsEx Lib "user32" (ByVal dwOptions As Long, ByVal dwReserved As Long) As Long

Private Const WIN_LOGOFF = 0

Dim s As Integer
Dim m As Integer
Dim h As Integer
Dim sec As Integer
Dim min As Integer
Dim hour As Integer
Dim Abbruch As Boolean
Dim frmontop As Double


Private Sub Form_Load()
  ' Minimieren/Maximieren Buttons zur
  ' Laufzeit anzeigen
  MinMaxButton Me
  
  ' Fenster immer im Vordergrund anzeigen
  TopWindow Me.hwnd
End Sub

Private Sub close_Click()
Dim F As Form

Abbruch = True

For Each F In Forms
  Unload F
  Set F = Nothing
Next


End Sub

Private Sub cmdStartTimer_Click()

Abbruch = False
Timer1.Interval = 1000
Timer1.Enabled = True
'fester Wert eintragen
s = 0
m = 1
h = 0
Label1.Caption = Format(h & " :" & m & " :" & s, "Long Time")
Do
If Abbruch = True Then Exit Do
DoEvents
cmdStartTimer.Enabled = False
If h = 0 And m = 3 And s = 0 Then
     MsgBox "15 minutes allowance are over. Please finish your work now.", vbOKOnly + vbSystemModal
 End If
Loop Until s = 0 And m = 0 And h = 0
Label1.ForeColor = vbRed
'MsgBox (NameC1 & "abgelaufen")
Timer1.Enabled = False
'Call ExitWindowsEx(WIN_LOGOFF, &HFFFF)
frmLock.Visible = True
Unload Me
End Sub

Private Sub Label9_Click()

End Sub

Private Sub Timer1_Timer()
s = s - 1
If s < 0 And m > 0 Then
m = m - 1
s = 59
ElseIf m <= 0 And h > 0 And s < 0 Then
h = h - 1
m = 59
s = 59
End If
Label1.Caption = Format(h & " :" & m & " :" & s, "Long Time")
End Sub


Lg
Sunflower84
 
Ich habe was gefunden aber nur mit ner MsgBox:

Code:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
 
 If Shift = vbCtrlMask And KeyCode = vbKeyQ Then
   MsgBox "Strg - Taste + Q wurde gedrückt"
 End If

Kann ich da ansatt der MsgBox auch die Form aufrufen damit der Timer wieder von vorne anfängt oder klappt das so nicht?

lg
Sunflower84
 
Eine Möglichkeit wäre eine für die ganze Form gültige boolsche Variable zu definieren. also zum Beispiel direkt nach "Option Explicit" das hier einfügen (so wie deine Abbruch-Variable)):
Visual Basic:
Dim blnReset as boolean
In dem KeyDown-Ereignis setzt du dann diese Variable auf TRUE (anstatt eine MsgBox anzuzeigen).
In deiner Do-Loop-Until-Schleife überprüfst du dann jedesmal, ob deine Variable blnReset auf TRUE steht. Wenn ja, dann setzt du die Zeit-Variablen eben wieder auf Null und dein Timer startet wieder von vorne.

Generell würde ich dir aber eine andere vorgehensweise vorschlagen, bei der du aber deinen gesamten Code umschreiben müsstest:
Du solltest die Überprüfung, ob die Zeit abgelaufen ist oder nicht, im Timer-Ereignis machen (also in Private Sub Timer1_Timer()) und nicht in Private Sub cmdStartTimer_Click().
Das heißt dein Code würde folgendermaßen aufgebaut sein:
In dem Click-Event vom Button (cmdStart) wird dein Timer-Objekt gestartet (Timer.Enabled = True)
Im Timer-Event lässt du die Zeit abwärts zählen (wie du das bereits machst)
Sollte die Zeit auf Null sein, dann passiert das, was passieren soll, aus dem Timer-Code heraus. (Zum Beispiel Unload Me oder was halt passieren soll)
Somit brauchst du keine Do-Loop-Schleife und auch kein DoEvents, wodurch dein Programm weniger Rechenleistung verschlingt und dein Code übersichtlicher wird.
 
Zuletzt bearbeitet:
Ich habe eine boolsche Variable deklariert und statt die MsgBox die Variable auf true gesetzt. In meiner Schleife setze ich den Timer doch schon auf Null !

Code:
Private Sub cmdStartTimer_Click()

Abbruch = False
Timer1.Interval = 1000
Timer1.Enabled = True
'fester Wert eintragen
s = 0
m = 1
h = 0
Label1.Caption = Format(h & " :" & m & " :" & s, "Long Time")
Do
If Abbruch = True Then Exit Do
DoEvents
cmdStartTimer.Enabled = False
If h = 0 And m = 3 And s = 0 Then
     MsgBox "15 minutes allowance are over. Please finish your work now.", vbOKOnly + vbSystemModal
 End If
Loop Until s = 0 And m = 0 And h = 0Label1.ForeColor = vbRed
'MsgBox (NameC1 & "abgelaufen")
Timer1.Enabled = False
'Call ExitWindowsEx(WIN_LOGOFF, &HFFFF)
frmLock.Visible = True
Unload Me
End Sub

Private Sub Label9_Click()

End Sub

Private Sub Timer1_Timer()
s = s - 1
If s < 0 And m > 0 Then
m = m - 1
s = 59
ElseIf m <= 0 And h > 0 And s < 0 Then
h = h - 1
m = 59
s = 59
End If
Label1.Caption = Format(h & " :" & m & " :" & s, "Long Time")
End Sub

Lg
Sunflower84
 
Ich habe es jetzt so hin bekommen das er mir mit Shift und F2 den Timer wieder von vorne beginnt. Also wieder bei 15 Minuten.
Habe aber jetzt das Problem das er mir nur auf die Tastenkombiation reagiert wenn ich nichts mache. Sobald ich den Browser auf mache reagiert er nicht mehr auf die Tastenkombi.
Das hier habe ich eingefügt:

Code:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

    Select Case Shift
        'wenn shift gedrueckt
        Case 1
            Select Case KeyCode
                'wenn f2 gedrueckt
                Case vbKeyF2
                    m = 15
                    s = 0
            End Select
    End Select


End Sub

Lg
Sunflower
 
Hi.

Die Tastenkombination funktioniert natürlich nur wenn dein Programm auch den Fokus hat. Global eine Tastenkombination zu erstellen ist schon etwas schwieriger: http://home.arcor.de/visualbasicforum/tipps/tipp5-5.htm

Übrigens kannst du deinen Code auch einfacher schreiben:
Visual Basic:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    ' wenn Shift+F2 gedrückt
    If KeyCode = vbKeyF2 And Shift = 1 Then
         m = 15
         s = 0
    End If
End Sub
Gruß
 
Das klappt jetzt. Habe das jetzt mit KeyHooks gelöst.
Habe aber jetzt noch einanderes Problem.
Wenn die Zeit um ist kommt ein Fullscreen den man erst mit einem Passwort wieder weg bekommt. Wie kann ich es machen das der Timer wenn ich das Passwort eingegeben habe wieder vorn vorne startet. Denn momentan wird der Timer nach der Eingabe des Passwortes direkt beendet.

Code:
Private Sub Command1_Click()
If Text1.Text = "edl2005" Then 'Passwort OK?
            Timer1.Interval = 1
            Timer1.Enabled = False
            FormOnTop Me.hwnd, False
            DestroyWindow Me.hwnd
            Unload Me
        
        End If
End Sub

Private Sub Form_Load()
    Timer1.Interval = 1
    Timer1.Enabled = True
    Me.WindowState = vbMaximized
    Me.Move 0, 0, Screen.Width, Screen.Height
    FormOnTop Me.hwnd, True
End Sub


Private Sub Timer1_Timer()
    'BringWindowToTop (Me.hWnd)
    FormOnTop Me.hwnd, True
End Sub



End Sub

Dort muss ich doch nur das Unload Me entfernen und diesen Timer aufrufen, oder?
Wenn ja wie rufe ich ihn auf?

Code:
Private Sub cmdStartTimer_Click()

Abbruch = False
Timer1.Interval = 1000
Timer1.Enabled = True
'fester Wert eintragen
s = 0
m = 1
h = 0
Label1.Caption = Format(h & " :" & m & " :" & s, "Long Time")
Do
If Abbruch = True Then Exit Do
DoEvents
cmdStartTimer.Enabled = False
If h = 0 And m = 3 And s = 0 Then
     MsgBox "15 minutes allowance are over. Please finish your work now.", vbOKOnly + vbSystemModal
 End If
Loop Until s = 0 And m = 0 And h = 0
Label1.ForeColor = vbRed
'MsgBox (NameC1 & "abgelaufen")
Timer1.Enabled = False
'Call ExitWindowsEx(WIN_LOGOFF, &HFFFF)
frmLock.Visible = True
Unload Me
End Sub

Private Sub Label9_Click()

End Sub

Private Sub Timer1_Timer()
s = s - 1
If s < 0 And m > 0 Then
m = m - 1
s = 59
ElseIf m <= 0 And h > 0 And s < 0 Then
h = h - 1
m = 59
s = 59
End If
Label1.Caption = Format(h & " :" & m & " :" & s, "Long Time")

Lg
Sunflower84
 
Zurück