6

我正在尝试制作一个程序来像Osu一样用键盘点击!.

我试过了SendKeys()RaiseMouseEvent()OnMouseClick()。现在我正在尝试这个并且无法得到任何工作。

我不断收到的错误是:

PInvoke 限制:不能返回变体。

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
4

3 回答 3

4

此示例在功能处于“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
于 2013-07-02T04:23:51.693 回答
1
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
于 2017-02-17T16:11:11.440 回答
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
于 2013-07-01T22:02:13.403 回答