Form altijd laten reageren op toetsen?

Status
Niet open voor verdere reacties.

roeney12

Gebruiker
Lid geworden
23 jul 2008
Berichten
105
Hey,

Ik heb een kleine stopwatch gemaakt. Het enigste probleem nu is dat ik hem wil kunnen bedienen terwijl er een ander programma 'geselecteerd' is.

Ik wil namelijk tijdens een filmpje kijken de tijd bij kunnen houden, maar als ik op een shortcut druk om bijvoorbeeld het filmpje twee keer zo snel te laten gaan, moet de stopwatch dit op precies hetzelfde moment doen. Ze moeten dus tegelijker tijd worden geactiveerd.

Hopelijk kan iemand mij helpen :D
 
Voeg deze code buiten een sub/functie toe:

PHP:
    <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Public Shared Function GetAsyncKeyState(ByVal vKey As Keys) As Short
    End Function

Voeg een nieuwe timer toe, zet deze op een interval van 50 en de property "Enabled" op True.

Dubbelklik op de timer, en voeg dan deze code toe:

PHP:
        If GetAsyncKeyState(Keys.A) <> 0 Then
            MessageBox.Show("Je hebt A gedrukt!")
        ElseIf GetAsyncKeyState(Keys.B) <> 0 Then
            MessageBox.Show("Je hebt B gedrukt!")
        End If

MessageBox.Show kan je veranderen naar wat er moet gebeuren als de gebruiker op een bepaalde toets drukt.

Zo zou het er ongeveer uit moeten zien:

8KEbz.png


Succes :)
 
Laatst bewerkt:
Ik wil deze topic niet kapen maar ik heb een vraagje:

de code werkt, alleen wil ik het niet met de toetsenbord toetsen activeren maar met de linker en rechtermuisknop.

Ik had al dit bedacht:

Code:
 <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Public Shared Function GetAsyncKeyState(ByVal vKey As MouseButtons) As Short
    End Function

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        If GetAsyncKeyState(Windows.Forms.MouseButtons.Left) <> 0 Then
            Timer1.Start()
            Timer3.Start()
        End If
    End Sub

    Private Sub Timer3_Tick_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        If GetAsyncKeyState(Windows.Forms.MouseButtons.Right) <> 0 Then
            Timer1.Stop()
            Timer3.Stop()
        End If

Maar het werkt niet. Het zou geweldig zijn als je me kunt helpen.

Alvast bedankt:D
 
@codGmer:

PHP:
        If GetAsyncKeyState(1) Then
            MessageBox.Show("Links geklikt")
        End If

PHP:
        If GetAsyncKeyState(2) Then
            MessageBox.Show("Rechts geklikt")
        End If

:)
 
Bedankt
Ik wil dat als de linkermuisknop is ingedrukt timer 1 aangaat en als je de linkermuisknop loslaat dat dan de timer 1
uit gaat is dit mogelijk?
 
@codGmer, jap beetje bewerken zoals je zelf al had gedaan:

PHP:
 <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Public Shared Function GetAsyncKeyState(ByVal vKey As Keys) As Short
    End Function

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        If GetAsyncKeyState(1) Then
            Timer1.Start()
            Timer3.Start()
        End If
    End Sub

    Private Sub Timer3_Tick_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        If GetAsyncKeyState(2) Then
            Timer1.Stop()
            Timer3.Stop()
        End If
 
Ik heb het getest, maar nu is het volgende probleem:

Als ik op de linkermuisknop druk dan gaat de timer aan, en hij gaat pas uit als je op de rechtermuisknop drukt.
Ik wil dus dat als je de linkermuisknop inhoud dat de timer aangaat todat de linkermuisknop is losgelaten.

Ik had al deze code:

Code:
<System.Runtime.InteropServices.DllImport("user32.dll")> _
    Public Shared Function GetAsyncKeyState(ByVal vKey As Keys) As Short
    End Function


    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        If GetAsyncKeyState(1) Then
            Timer1.Start()
            Timer3.Start()
        End If
    End Sub

    Private Sub Timer3_Tick_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        If GetAsyncKeyState(1) Then
            Timer1.Stop()
            Timer3.Stop()
        End If
    End Sub

Alleen dan is het andersom dus dat als je de linkermuisknop inhoudt de timer stopt en als je het lostlaat dat de timer aangaat.
 
Ik heb eventueel nog een alternatief voor je dat prima werkt (net getest).

Download deze dll:
http://www.themightyatom.nl/stuff/WindowsHookLib.dll
Voeg deze toe aan je toolbox (hopelijk weet je hoe)

Je zult 3 nieuwe componenten zien:
ClipboardHook
LLKeyboardHook
LLMouseHook.

Plaats een LLMouseHook op je form.
Dubbelklik op je form zodat de Form_Load sub klaargezet wordt.
Schijf de volgende regel in die sub:
Code:
LlMouseHook1.InstallHook()
Ga terug naar je designer en selecteer het LLMouseHook component en ga naar de lijst met beschikbare events.
Dubbelklik op het event MouseDown
Schrijf deze regel in de MouseDown sub die dan klaar gezet word:
Code:
Timer1.Start() 'Eventueel aanpassen/vervangen met jouw timers
Keer terug naar je designer.
Uit de lijst met events voor de LLMouseHook kies je nu het MouseUp event.
In de sub voor dit event schrijft je:
Code:
Timer1.Stop() 'Eventueel aanpassen/vervangen met jouw timers
In het Form_Closing event of elk andere sub dat je programma afsluit nog even dit bijzetten:
Code:
LlMouseHook1.Dispose()
 
Laatst bewerkt:
Oh, ik snap het al.

Ik ga het even testen.
 
Laatst bewerkt:
De timer gaat wel aan maar als ik de linkermuisknop inhoudt dan gaat de timer maar 1 keer aan een halve seconde ofzo terwijl ik de knop nog steeds ingedrukt heb.
 
Die heb ik nodig voor de sub la
 
Laatst bewerkt door een moderator:
Ja dat snap ik ook nog wel, maar het klikken wordt al door de MouseHook gedaan, dus die mouse_event Lib is volgens mij overbodig.
 
Ok dan zal ik dat verwijderen, maar dan werkt de sub la niet. Weet jij een alternatief voor de code van la.
 
Hey, bedankt voor de code, hij werkt!
nog 2 kleine probleempjes: ik heb een variabele x
nu is de variabele standaard 1, maar wil ik dat hij door op een knop te drukken veranderd wordt (en dus de stopwatch sneller/langzamer te laten lopen (vraag me niet waarom :P)).
om de stopwatch langzamer te laten lopen moet de waarde 0.25 of 0.5 zijn, alleen werkt dit niet. ik heb ook al geprobeert om x = 1/4 enz. te gebruiken.
enige andere oplossingen?

Het andere probleem is dat de stopwatch bij games niet bovenaan staat, ook al heb ik always on top aan staan. Het gaat om de game Call of Duty 4 (en waarschijnlijk ook bij andere games, maar dit heb ik nog niet getest). De stopwatch zit dus 'achter' de game en is niet zichtbaar, wat hem een beetje nutteloos maakt :P.

(je mag best dit topic overnemen, misschien leer ik er ook nog wat van! ;))
 
Laatst bewerkt:
Om 'm altijd boven alles te krijgen kan je het zo doen, in een timer (met interval +/- 100):

Deze dllimport toevoegen
PHP:
    <DllImport("user32.dll")> _
Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

Dit op de timer:
PHP:
SetForegroundWindow(Process.GetCurrentProcess().MainWindowHandle)

En gebruik voor die variabele X het type Decimal of Double :)

Succes.
 
Hey, de code gaf een aantal errors, (DllImport had een verklaring nodig, en MarshalAs kende die niet ofzo?) daarom heb ik de code aangepast (m.b.v. Visual Studio zelf) maar ik heb geen idee of het nu klopt zoals jij bedoelde. Hij staat wel bovenaan, maar wordt ook meteen geselecteerd, waardoor het spel wordt geminimaliseerd.

Dit is mijn code nu:
PHP:
Public Class Form1
    <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Public Shared Function GetAsyncKeyState(ByVal vKey As Keys) As Short
    End Function

    <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.Bool)> Boolean
    End Function

    Dim x As Integer = 1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Timer1.Interval = 1
        Label4.Text = Label4.Text + x
        If Label4.Text >= 59 Then
            Label3.Text = Label3.Text + 1
            Label4.Text = "00"
        End If
        If Label3.Text >= 59 Then
            Label2.Text = Label2.Text + 1
            Label3.Text = "00"
        End If
        If Label2.Text >= 59 Then
            Label1.Text = Label2.Text + 1
            Label2.Text = "00"
        End If

    End Sub

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.KeyValue = Keys.Escape Then
            Me.Close()
        End If
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        If GetAsyncKeyState(Keys.Enter) <> 0 Then
            Timer1.Start()
        ElseIf GetAsyncKeyState(Keys.NumPad5) <> 0 Then
            x = 1
        ElseIf GetAsyncKeyState(Keys.NumPad2) <> 0 Then
            x = 1
        ElseIf GetAsyncKeyState(Keys.NumPad4) <> 0 Then
            x = 1
        ElseIf GetAsyncKeyState(Keys.NumPad6) <> 0 Then
            x = 2
        ElseIf GetAsyncKeyState(Keys.NumPad8) <> 0 Then
            x = 5
        ElseIf GetAsyncKeyState(Keys.NumPad0) <> 0 Then
            Timer1.Stop()
        ElseIf GetAsyncKeyState(Keys.Home) <> 0 Then
            Timer1.Stop()
            Label4.Text = "00"
            Label3.Text = "00"
            Label2.Text = "00"
            Label1.Text = "00"
        ElseIf GetAsyncKeyState(Keys.End) <> 0 Then
            Me.Close()
        End If
    End Sub

    Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        SetForegroundWindow(Process.GetCurrentProcess().MainWindowHandle)
    End Sub
End Class

de x = 1 bij numpad2 (r 48) en numpad4 (r 50) moeten decimalen worden, alleen ik ben daar nog helemaal niet bekend mee... misschien iets meer uitleg over het type Decimal en Double? :o

graag uitleg over de codes (wat alles doet), altijd handig voor latere projecten enz :)

EDIT: Decimal heb ik al uitgevogeld ;) oh en jou (CaptainBri) stukje code staat in regel 6
 
Laatst bewerkt:
Na het ene volgt het andere probleem natuurlijk :P

Nu heb ik dus wel decimalen als waarde, maar ik wil dat het label deze decimalen niet weergeeft.
Na kort zoeken kwam ik bij een 'Round' functie, maar ik weet niet hoe ik dit in mijn code moet verwerken.

PS: kijk ook nog steeds even naar #19 aub ;)
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan