2013-07-01 129 views
4

我正在試圖製作一個程序來點擊鍵盤,如Osu!。 我試過SendKeys()RaiseMouseEvent()和OnMouseClick()。現在,我想這一點,並不能得到任何工作...... 我不斷收到錯誤PInvoke restriction: cannot return variants.如何模擬鼠標點擊?

Public Class Form1 
    Dim onn As Boolean = False 
    Declare Function mc Lib "user32.dll" Alias "mouse_event" (flag, x, y, button, extra) 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     If Not onn Then 
      Button1.Text = "Off" 
      Label1.Text = "Status: On" 
      onn = True 
     ElseIf onn Then 
      Button1.Text = "On" 
      Label1.Text = "Status: Off" 
      onn = False 
     End If 
    End Sub 
    Private Sub Form1_KeyPress1(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress 
     If onn And (e.KeyChar = "Z" Or e.KeyChar = "X" Or e.KeyChar = "z" Or e.KeyChar = "x") Then 
      mc(&H2, 0, 0, 0, 0) 
      mc(&H4, 0, 0, 0, 0) 
     End If 
    End Sub 
End Class 

回答

3

此實例點擊其中鼠標目前是當特徵處於「ONN」狀態:

Public Class Form1 

    Private onn As Boolean = False 

    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, _ 
     ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, _ 
     ByVal dwExtraInfo As Integer) 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     Me.KeyPreview = True 
     Button1.Text = "Off" 
    End Sub 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     onn = Not onn 
     Button1.Text = IIf(onn, "On", "Off") 
    End Sub 

    Private Sub Form1_KeyPress1(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress 
     If onn Then 
      Select Case e.KeyChar 
       Case "Z", "z", "X", "x" 
        mouse_event(&H2, 0, 0, 0, 0) 
        mouse_event(&H4, 0, 0, 0, 0) 

      End Select 
     End If 
    End Sub 

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
     Debug.Print("Button2") 
    End Sub 

    Private Sub Button3_Click(sender As Object, e As System.EventArgs) Handles Button3.Click 
     Debug.Print("Button3") 
    End Sub 

End Class 
+0

將光標移動到右邊的按鈕?這不是我想要做的。我不想用鼠標點擊按鈕。該按鈕將其打開。當我點擊z或x時,我想點擊其他的東西,就像我點擊鼠標按鈕一樣。例如,如果我現在將鼠標移動到「添加註釋」上,然後點擊z或x,就會像點擊鼠標一樣點擊它。 – Devonx25

+0

如果你想用mouse_event()API來點擊東西,那麼你必須先移動鼠標並點擊零作爲參數(如你的例子),或者你必須指定實際座標點擊。我的示例將光標放回到執行單擊之後的位置。所以,如果你想「點擊其他的東西」,然後將鼠標移動到其他的東西,執行點擊,然後把鼠標放回... –

+0

我不想移動代碼的鼠標。我希望它能夠點擊它的位置。 – Devonx25

0

嘗試使用PerformClick()方法:

Button1.PerformClick() 

在你的代碼,它可能是這樣的:

If onn And (e.KeyChar = "Z" Or e.KeyChar = "X" Or e.KeyChar = "z" Or e.KeyChar = "x") Then 

    Button1.PerformClick() 
End If 
+0

我剛試過,那不是我想要做的。點擊按鈕。該按鈕應該打開它,然後按鍵z和x應該點擊,如果我點擊了鼠標左鍵。 – Devonx25

0
Public Class Iconform 

    Public Declare Auto Function SetCursorPos Lib "User32.dll" (ByVal X As Integer, ByVal Y As Integer) As Long 

    Public Declare Auto Function GetCursorPos Lib "User32.dll" (ByRef lpPoint As Point) As Long 

    Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) 

    Public Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down 

    Public Const MOUSEEVENTF_LEFTUP = &H4 ' left button up 

    Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 ' middle button down 

    Public Const MOUSEEVENTF_MIDDLEUP = &H40 ' middle button up 

    Public Const MOUSEEVENTF_RIGHTDOWN = &H8 ' right button down 

    Public Const MOUSEEVENTF_RIGHTUP = &H10 ' right button up 



    Private Sub NotifyIcon1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.Click 

    SettingsForm.Show() 



    End Sub 



    Private Sub OptionsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OptionsToolStripMenuItem.Click 

    SettingsForm.Show() 

    End Sub 



    Private Sub CloseToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseToolStripMenuItem.Click 

    Me.Close() 



    End Sub 

    Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown 

    Dim bHandled As Boolean = False 

    Dim xPos As Integer = Windows.Forms.Cursor.Position.X.ToString 

    Dim zPos As Integer = Windows.Forms.Cursor.Position.Y.ToString 



    Select Case e.KeyCode 

     Case Keys.Right 

     Windows.Forms.Cursor.Position = New Point(xPos + 10, zPos) 

     Case Keys.Left 

     Windows.Forms.Cursor.Position = New Point(xPos - 10, zPos) 

     Case Keys.Down 

     Windows.Forms.Cursor.Position = New Point(xPos, zPos + 10) 

     Case Keys.Up 

     Windows.Forms.Cursor.Position = New Point(xPos, zPos - 10) 

     Case Keys.D 

     mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) 







    End Select 

    End Sub 

End Class