【发布时间】:2019-08-17 08:50:18
【问题描述】:
我试图在按住 LButton 时自动重复它,然后在它释放时停止,我遇到了一个问题,即使它没有被按住它也会不断重复。
是否有任何解决方法?我还需要它来处理其他应用程序,这就是我使用 GetAsyncKeyState 的原因。
这是我目前所拥有的:
Imports System.Threading
Public Class Form1
Const KeyDownBit As Integer = &H8000
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Integer) As Short
Private Declare Sub mouse_event Lib "user32" (ByVal dwflags As Integer, ByVal dx As Integer, ByVal cbuttons As Integer, ByVal dy As Integer, ByVal dwExtraInfo As Integer)
Private Const mouseclickup = 4
Private Const mouseclickdown = 2
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If (GetAsyncKeyState(Keys.LButton) And KeyDownBit) = KeyDownBit Then
mouse_event(mouseclickup, 0, 0, 0, 0)
Thread.Sleep(100)
mouse_event(mouseclickdown, 0, 0, 0, 0)
End If
End Sub
使用此代码,当我左键单击时,即使释放 Lbutton,代码也会不断自动单击,但这并不是我想要的。我想要它,所以当我按住LButton时,它会连续点击,然后当LButton松开时,它会停止点击。
我尝试过使用BackgroundWorker,尽管发生了同样的事情。
我也尝试过在mouse_event(mouseclickup, 0, 0, 0, 0) 之前使用mouse_event(mouseclickdown, 0, 0, 0, 0),但每次按下它时它只会将单击变成双击,然后停止。
【问题讨论】:
-
我认为您不应该使用
GetAsyncKeyState,文档指出:“确定在调用函数时键是向上还是向下,以及该键是否在上一次调用 GetAsyncKeyState 后按下。" (强调我的)。 -
你试过用
GetKeyState代替吗? -
@Dai :文档还说:“如果设置了最高有效位,key is down”,这就是@ 987654328@变量用于检查。计时器中的
If-statement 只会在键实际按下时返回True,所以他使用GetAsyncKeyState没有问题。 -
这里的问题是你的代码一直在点击和检查
LButton。它会一直点击,因为每次执行If-statement 时也会触发LButton。我知道避免这种情况的唯一方法是将鼠标单击窗口消息发送到位于鼠标下方的窗口。不过,这种方法有些先进。 -
我有空的时候看看能不能给你一个解决方案。
标签: vb.net