kostenloser Webspace werbefrei: lima-city


Mouse Events systemweit VB .net

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    aklasse

    Kostenloser Webspace von aklasse

    aklasse hat kostenlosen Webspace.

    Hi Leute,
    ich möchte ein Program schreiben das Mausklicks erkennt. Dafür muss ich die Klicks systemweit erkennen.

    Gibt es eine Möglichkeit in VB 2008 die Mouse Events zu erkennen. (Mouse down, Mouse up)

    Vielen Dank für die Hilfe!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    Wenn du das systemweit haben willst, ist das, was du suchst, ein "Mouse-Hook". Kannst ja bei Google danach suchen, ansonsten hast du z.B. hier einen Beispielcode dazu.
  4. Ich habe das gleiche Problem nur würde ich das gerne anders als mit Mouse-Hook lösen könntet ihr mir dafür vieleicht einen kleinen Bespielcode (oder eine andere art von hilfe) Geben?

    Ich nutze:

    Visual Basic 2010 Express
    Programm wir mit .NET-Framework3 erstellt
  5. Autor dieses Themas

    aklasse

    Kostenloser Webspace von aklasse

    aklasse hat kostenlosen Webspace.

    was mich verweundert ist, das man die postition des zeigers ja problemlos systemweit auslesen kann, nur eben nicht den klick. gibt es das keinen trick?
  6. Hi,
    einen Trick gibts: verwende mal diese Funktion:
    Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

    Für die Maustasten kannst du dieser Funktion folgende Übergabe-Wert übergeben:
    Private Const LMT = &H1 'Konstante für Linke Maustaste
    Private Const RMT = &H2 'Konstante für Rechte Maustaste
    Private Const MMT = &H4 'Konstante für Mittlere Maustaste

    Es ist keine Event-Funktion wie du sie schon von VB kennst. Du musst periodisch abfragen, ob die Taste gedrückt wurde (z.B. mit einem Timer, jede ms).
    Die Abfrage gestaltet sich dann so:
    dim linkeMaustaste as long = GetAsyncKeyState (LMT)
    if CBool(linkeMaustaste) then
       Msgbox("Linke Maustaste wurde systemweit gedrückt.")
    end if

    ----------
    Nachtrag 1: Die Funktion liefert bei gedrückter Taste immer den Wert -32767 zurück. Ist die Taste nicht gedrückt, so wird 0 zurückgeliefert. Die Umwandlung nach Bool liefert also immer true, wenn nicht 0 zurückgegeben wurde. Du kannst dir natürlich auch eine Konstante definieren und diese dann für deine Abfrage nutzen, z.B. so:
    Private Const KeyPressed = -32767

    if GetAsyncKeyState(LMT) = KeyPressed then
       MsgBox("Linke Maustaste gedrückt.")
    end if

    ----------
    Nachtrag 2: Wenn du nun MouseUp und MouseDown auswerten willst, dann musst du das über zusätzliche Abfragen tun. Bei Bedarf kann ich dir das auch erklären. Mir wäre es aber lieber, wenn du selber daran knobelst, weil solche Sachen beim Programmieren einfach dazugehören und auch den größten Teil des Spaßes ausmachen dabei (zumindest bei mir :wink:). Also viel Spaß dabei^^
    ----------
    Nachtrag 3: Wenn du das hingekriegt hast, dann kannst du dir eine eigene Klasse schreiben, die das Tastendrücken so ermittelt, wie vorhin beschrieben und Events rausschmeisst, wenn irgendein MouseUp oder MouseDown passiert ist. Diese Events kannst du dann in deiner Anwendung verwenden, so wie du es gewohnt bist. Stichwörter nach denen du dazu suchen könntest sind:
    Delegate Sub, Event, RaiseEvent.
    Falls es da Probleme gibt, kannst du es natürlich in einem weiteren Thread posten, dann helfe ich dir gern. Aber bitte erstmal selbst ein wenig rumprobieren, hast erstmal genug Hilfestellung bekommen von mir :-))))

    Beitrag zuletzt geändert: 13.11.2010 21:11:39 von tangoal
  7. Autor dieses Themas

    aklasse

    Kostenloser Webspace von aklasse

    aklasse hat kostenlosen Webspace.

    Thanks so much! :thumb:

    also hier mein code wie er bisher ist:

    Public Class Form1
        Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
        Private Const LMT = &H1 'Konstante für Linke Maustaste
        Private Const RMT = &H2 'Konstante für Rechte Maustaste
        Private Const MMT = &H4 'Konstante für Mittlere Maustaste
        Dim last As Integer
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim linkeMaustaste As Long = GetAsyncKeyState(LMT)
    
            If CBool(linkeMaustaste) Then
                If last = 0 Then
                    last = 1
                    'Mouse DOWN
                End If
            Else
                If last = 1 Then
                    last = 0
                    'Mouse UP
                End If
            End If
    
        End Sub
    End Class


    Ich habe allerdings das Problem, dass auch alle Zeichen der Tastertur außer der normalen Buchstaben wie ein Mauseklick gewertet werden.
    Außerdem ist mir aufgefallen, dass die Funktion nciht nur 0 und -32767 zurück lieftert sondern zwischendurch auch viele andere Werte. Woher kommt das?
    Kann es sein, das unter Windows 7 das anders läuft?

    Liebe Grüße und vielen Dank für die Hilfe
    Stefan
  8. aklasse schrieb: Ich habe allerdings das Problem, dass auch alle Zeichen der Tastertur außer der normalen Buchstaben wie ein Mauseklick gewertet werden.
    Außerdem ist mir aufgefallen, dass die Funktion nciht nur 0 und -32767 zurück lieftert sondern zwischendurch auch viele andere Werte. Woher kommt das?
    Kann es sein, das unter Windows 7 das anders läuft?
    Ja, diese Funktion wertet auch Tastaturwerte aus. Es gibt eine Liste an sogenannten Virtual Key Codes, die du jeweils dieser Funktion übergeben kannst, um zu prüfen, ob die Taste gedrückt wurde (siehe Microsoft Seite).
    Achso, zum Rückgabewert: Ja, kann auch noch andere Werte enthalten (siehe diese Microsoft Seite). Die Funktion liefert in dem Rückgabewert noch mehr Informationen zurück, auf die man sich jedoch laut Microsoft nicht unbedingt verlassen darf...
    Hm, bei mir funktioniert das so... ist mir nicht bekannt, ob das mit Win7 funktioniert oder nicht... ich arbeite auf XP.
    Also, wenn du eine Taste drückst, so wird deine If-Bedingung CBool(linkeMaustaste) wahr?
  9. Du musst die Bitwerte abprüfen

    statt

    if GetAsyncKeyState(LMT) = KeyPressed then
    MsgBox("Linke Maustaste gedrückt.")
    end if


    if ((GetAsyncKeyState(LMT) AND KeyPressed) = KeyPressed) then
       MsgBox("Linke Maustaste gedrückt.")
    end if


  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!