Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Mouse-eventtejä?

Keltanokka [11.11.2011 15:02:42]

#

Morjens,

Se tökkäs viimekerralla vähän, mutta alkuun lähti ja vielä ohjelma tuli valmiiksi asti, kiitos kaikille jotka silloin auttoivat.

Nyt sellasta kysyn, että vähän pienenpi ohjelma menossa ja formilla on labeleita 4 kpl. Pikanäppäimillä 1 ja 2 saa asetettua hiiren koordinaatit tällä tavalla: (tämä siis toimii)

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = System.Windows.Forms.Keys.D1 Then
            Label1.Text = MousePosition.X
            Label2.Text = MousePosition.Y
        End If
    End Sub

Ja tästä eteenpäin on ongelmia. Tarkoituksena olisi saada näppäimellä 5 timer päälle ja samalla mouse_eventit. Hiiren tulisi liikkua koordinaatteihin, jotka on annettu ylhäällä ja klikata siihen pisteeseen. Mutta ettei mene liian helpoksi, niin textboxissa on annettu numero 1-50, joka kertoo kuin tiuhaan hiirin klikkailee pisteitä.

Esim.
label1.text = 1 (piste A:n X koordinaatti)
label2.text = 1 (piste A:n Y koordinaatti)
label3.text = 10 (piste B:n X koordinaatti)
label4.text = 10 (piste B:n Y koordinaatti)
textbox1.text = 15

Näillä tiedoilla hiiren tulisi klikata heti, kun olen painanut "5":sta niin pistettä A ja sen jälkeen odottaa 15 sekuntia. Sen jälkeen pistettä B ja taas 15:n sekunnin odotus ja pisteen A klikkaus. Tätä niin kauan kuin painan "6":sta ja timer pysähtyy.

Kiitos todella paljon niille, jotka jaksavat miettiä tätä :)

neau33 [11.11.2011 17:57:10]

#

Moikka Keltanokka!

vääntele oheisen esimerkin pohjalta...

Public Partial Class MainForm

#Region "mouse_event API and Constants"
   Declare Auto Sub mouse_event Lib "user32" _
   (ByVal dwFlags As Int32, ByVal dx As Int32, _
   ByVal dy As Int32, ByVal cButtons As Int32, _
   ByVal dwExtraInfo As IntPtr)

   Const MOUSEEVENTF_MOVE As Int32 = &H1 ' mouse move
   Const MOUSEEVENTF_LEFTDOWN As Int32 = &H2 ' left button down
   Const MOUSEEVENTF_LEFTUP As Int32 = &H4 ' left button up
   Const MOUSEEVENTF_RIGHTDOWN As Int32 = &H8 ' right button down
   Const MOUSEEVENTF_RIGHTUP As Int32 = &H10 ' right button up
   Const MOUSEEVENTF_MIDDLEDOWN As Int32 = &H20 ' middle button down
   Const MOUSEEVENTF_MIDDLEUP As Int32 = &H40 ' middle button up
   Const MOUSEEVENTF_ABSOLUTE As Int32 = &H8000 ' absolute move
   Const MOUSEEVENTF_WHEEL As Int32 = &H800 ' wheel button rolled
#End Region

   Private AllowExit As Boolean
   'Private AllowClick As Boolean 'ks.(*)

   Public Sub New()
      Me.InitializeComponent()
   End Sub

   Sub MainForm_KeyUp(sender As Object, e As KeyEventArgs)

      If e.KeyCode = Keys.F5 Then

         Dim lbl As Label = Nothing
         Dim Delay As Integer = _
         CType(Val(textBox1.Text) * 1000, Integer)
         Dim mx As Integer = 0
         Dim my As Integer = 0

         AllowExit = False

         Do While Not AllowExit

            Application.DoEvents

            For i As Integer = 1 To 4

               Application.DoEvents

               lbl = CType(Me.Controls("label" & CStr(i)), Label)

               If AllowExit Then
                  Exit For
               End If

               If i Mod 2 = 0 Then

                  my = CInt(Val(lbl.Text))

                  'koordinaatit koko lomakkeelle
                  'mx += Me.Left
                  'my += Me.Top

                  'koordinaatit lomakkeen piirtoalueelle
                  Dim MyPoint As Point = _
                  Me.PointToClient(New Point(Me.Left, Me.Top))
                  mx += Me.Left - MyPoint.X
                  my += Me.Top - MyPoint.Y

                  'siirtää hiiren osoittimen määritettyjen
                  'näyttökoordinaattien mukaiseen pisteeseen ja
                  'simuloi hiiren vasemman painikkeen painallusta...
                  Dim dest_x As Integer  = CType(mx * 65535 _
                  / Screen.PrimaryScreen.Bounds.Width, Integer)
                  Dim dest_y As Integer = CType(my * 65535 _
                  / Screen.PrimaryScreen.Bounds.Height, Integer)
                  mouse_event(MOUSEEVENTF_ABSOLUTE + _
                  MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTDOWN + _
                  MOUSEEVENTF_LEFTUP, dest_x, dest_y, 0, IntPtr.Zero)
                  '...

                  'siirtää hiiren osoittimen määritettyjen
                  'näyttökoordinaattien mukaiseen pisteeseen
                  'ilman mouse_event API rutiinia...
                  'Cursor.Position = New Point(mx, my)

                  '(*) jos tällä lomakkeella olevan ohjausobjektin
                  'Click_tapahtuman koodi halutaan suorittaa hiiren
                  'osoittimen siirtyessä ohjausobjektin päälle ilman,
                  'että käytetään mouse_event API rutiinia...
                  'AllowClick = True

                  DoDelay(Delay)

               Else
                  mx = CInt(Val(lbl.Text))
               End If

               lbl = Nothing

            Next

         Loop

      End If

   End Sub

   Sub MainForm_KeyDown(sender As Object, e As KeyEventArgs)
      If e.KeyCode = Keys.F6 Then
         AllowExit = True
      End If
   End Sub

   Sub DoDelay(ByVal delay As Integer)

      Dim sw As New Stopwatch
      sw.Start()
      Do While sw.ElapsedMilliseconds < delay And Not AllowExit
         Application.DoEvents()
      Loop
      sw.Stop()

   End Sub

   Sub Button1_MouseEnter(sender As Object, e As EventArgs)

      If AllowClick Then '(*)
         AllowClick = False
         Button1_Click(Me, New System.EventArgs())
      End If

   End Sub

   Sub Button1_Click(sender As Object, e As EventArgs)
      MsgBox("Button1 clicked")
   End Sub

   Sub MainForm_FormClosing(sender As Object, e As FormClosingEventArgs)
      AllowExit = True
   End Sub

End Class

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta