Announcement

Collapse
No announcement yet.

Simples Programm zur Manipulation der Mausbewegung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Simples Programm zur Manipulation der Mausbewegung

    Hallo Forum,

    vom Entwickeln verstehe ich zwar etwas, aber nicht besonders viel.
    Deshalb eine Frage (ob sie hier richtig ist, weiss ich nicht.).
    Ich bräuchte nur ein kleines Programm, dass wenn ich eine bestimmte Taste drücke, während ich diese drücke die Maus nur vertikal zu bewegen ist.
    Also während ich z.B. die SHIFT-Taste drücke, kann man die Maus nur vertikal (hoch und runter) bewegen und nicht aus Versehen einen Pixel nach rechts oder links. Das würde mir sehr bei meiner Arbeit helfen.
    Ich hoffe ihr helft auch bei solchen ziemlich blöden Anfragen.
    Wenn ihr aber so ein Programm kennt, dann wär das ja auch schonmal eine Hilfe. Es darf nur eben nicht viel System-Ressourcen verbrauchen.
    Danke,

    fsm

  • #2
    Suche dir eine Programiersprache, implementiere
    http://msdn.microsoft.com/en-us/libr...90(VS.85).aspx

    mit einem WH_MOUSE Mouse Proc Hook
    Christian

    Comment


    • #3
      Danke Christian,

      meine Visual Basic-Kenntnisse werden dafür wahrscheinlich ausreichen. (Ich hoffe das funktioniert mit VB6, naja ich werde sehen)
      Bis später,

      fsm

      edit: ok sie reichen nicht ... mein wissen von vb beschränkt sich auf forms, module und ... nicht viel mehr (reicht das oder reicht das nicht??)
      Zuletzt editiert von fsm; 07.08.2008, 01:35.

      Comment


      • #4
        Ich habe das jetzt einfach versucht in VB zu realisieren, aber mit dem Gebrauch ein paar Klassen und Modulen von einer anderen Webseite. Soweit funktioniert alles prima. Mein Problem besteht nun darin, dass ich die "Keyabfrage" noch nicht perfektioniert habe. Sie funktioniert nur, wenn meine Form aktiv ist, also im Vordergrund. Sie muss aber Programm-Übergreifend funktionieren. Ich poste einfach mal den relevanten Quelltext (VB6):
        Code:
        Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
        If KeyCode = 65 Then
        If First = True Then
        MouseX = Mouse.X
        First = False
        Else
        Mouse.X = MouseX
        End If
        End If
        End Sub
        
        Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
        If KeyCode = 65 Then
        First = True
        End If
        End Sub
        
        Private Sub Form_Load()
        First = True
        End Sub
        MouseX ist eine Integer-Variable und Mouse.X kommt von einem Modul her, welches einfach angibt, wo sich die Maus grade befindet. Soweit funktioniert das (für meine Zwecke) ganz gut, auch wenn die Maus immer noch etwas "hin- und herschlackert". Ich brauche nur eine Alternative zu Form_KeyDown bzw. Form_KeyUp

        tia,

        fsm

        Comment


        • #5
          Mit der Lösung auf KeyDown/KeyUp-Events (oder konsorten) kanns es nicht funktioniern. Diese sind an ein Formulargebunden.

          Hierzu musst du schon die URL von Christian durchlesen, verstehen und einsetzen.

          Comment


          • #6
            ja das hab ich gemerkt, aber das durchlesen klappt nicht so ganz weil ich nix verstehe, habe das problem jetzt aber anders gelöst (und es klappt)
            so ... jetzt: ich will auch mausbewegegungen und klicks wie in einem makro aufnehmen und hab jetzt diesen quellcode:
            Code:
            Option Explicit
            Private Declare Function GetAsyncKeyState Lib "user32" _
                    (ByVal vKey As Long) As Integer
            Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
            Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long
            Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
            Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
            Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
            Private Declare Function ReleaseCapture Lib "user32" () As Long
            Private Type POINTAPI
              X As Long
              Y As Long
            End Type
            Dim First As Boolean
            Dim RecordlpRect() As POINTAPI
            Dim i As Integer
            Dim MouseX As Integer
            
            Private Sub Command1_Click()
            Record
            End Sub
            Private Sub Play()
              RecordTimer.Enabled = True
            End Sub
            
            Private Sub Command2_Click()
            Play
            End Sub
            
            Private Sub Form_Load()
            First = True
            End Sub
            
            Private Sub RecordTimer_Timer()
              Static Ri As Integer
              If Command1.Caption = "&Stop" Then
                i = i + 1
                ReDim Preserve RecordlpRect(i)
                GetCursorPos RecordlpRect(i)
                Form4.Caption = "Recording ..."
              Else
                Form4.Caption = "Play ..."
                Ri = Ri + 1
                If Ri <= i Then
                  SetCursorPos RecordlpRect(Ri).X, RecordlpRect(Ri).Y
                Else
                  Form4.Caption = "Record ended"
                  Ri = 0
                  RecordTimer.Enabled = False
                  Command1.Caption = "&Record"
                End If
              End If
            End Sub
            
            Private Sub Timer1_Timer()
            Dim X As Long
            If GetAsyncKeyState(65) Then
            If First = True Then
            MouseX = Mouse.X
            First = False
            Else
            Mouse.X = MouseX
            End If
            Else
            First = True
            End If
            End Sub
            
            Private Sub Record()
              Select Case Command1.Caption
                Case "&Record"
                  i = 0
                  Erase RecordlpRect
                  Command1.Caption = "&Stop"
                  Command2.Enabled = False
                  RecordTimer.Enabled = True
                Case "&Stop"
                  RecordTimer.Enabled = False
                  Command1.Caption = "&Record"
                  Command2.Enabled = True
                  Form1.Caption = _
                        "Record stopped - Click play"
                  Command2.SetFocus
              End Select
            End Sub
            ich hoffe jemand versteht alles, habe recht viele APIs, um alles zu realisieren, im Prinzip aber einfach aufgebaut
            das problem ist nun aber, dass er natürlich noch nicht die klicks speichert und wiedergibt.
            weiss dazu jemand eine lösung?

            tia,

            fsm



            edit: ich weiss nicht aber falls ein admin oder so das sieht kann er es ja ins vb-forum "umposten", das würde glaub ich besser passen

            Comment


            • #7
              ok ich hab jetzt mit timern und so nem kram was gebastelt und es funktioniert soweit ... es speichert die mausbewegungen und klicks makroartig
              dann klickt man auf play und alles wird genauso ausgeführt
              nur dann -> dann scheint die maus durchzudrehen sie klickt rasend schnell hintereinander obwohl man selbst nichts macht
              man muss nur über einen link etc. sich bewegen und er wird angeklickt. grösstes problem dabei ist, dass man alles auf dem weg aus versehen anklickt ... nervig beim testen
              NUR -> ihr wisst doch bestimmt wie ich diese klicks (vielleicht sind die in der windows-warteschleife ... aber wohl eher nicht, weil sie aufhören sobald ich das programm über ein kunststück mit alt+tab und alt+f4 beende also das ist gar nicht so leicht weil das programm immer nur den bruchteil einer sekunde geöffnet ist und sich dann schliesst)
              AUF JEDEN FALL -> ich habs schon hiermit versucht
              Code:
              'Deklarationsteil:
              Type POINTAPI
                x As Long
                Y As Long
              End Type
              Type MSG
                hWnd As Long
                message As Long
                wParam As Long
                lParam As Long
                time As Long
                pt As POINTAPI
              End Type
              Declare Function PeekMessageA Lib "user32" ( _
                  lpMsg As MSG, ByVal hWnd As Long, _
                  ByVal wMsgFilterMin As Long, _
                  ByVal wMsgFilterMax As Long, _
                  ByVal wRemoveMsg As Long) As Long
              Const PM_REMOVE = &H1
              Const WM_MOUSEFIRST = &H200
              Const WM_MOUSELAST = &H209
              
              'Prozedur:
              Sub MouseIdle(ByVal hWnd As Long)
                Dim x As MSG
                Do While PeekMessageA( _
                    x, hWnd, WM_MOUSEFIRST, _
                    WM_MOUSELAST, PM_REMOVE)
                Loop
              End Sub
              Das hab ich mal so als Modul gemacht aber ich muss ja beim MouseIdle dieses hWnd eingeben, der was auch immer vom fenster ... aber welches fenster will ich denn idlen? und wie bekomm ich die hwnd heraus?
              funktioniert das überhaupt wenn die nicht in der windows-warteschleife sind? wodurch werden diese klicks erzeugt? BITTE BITTE ich bin so verzweifelt

              fsm

              Comment

              Working...
              X