2016-12-14 121 views
-2

我正在创建一个程序,使用我的鼠标和键盘自动与另一个应用程序进行交互。我发现代码会立即点击该键并立即释放它(据我所知);这是SendKeys.Send(“{up}”)。请不要过于复杂的事情,如果你可以,即时在这里学习。如何按住按键?

我的问题是如何发送按键,并保持一段时间由变量决定。我大致想要:

Press and hold arrow key "up" 
wait(Random.next(1,10)) 
Release arrow key "up" 

我在Visual Studio 17社区中使用Visual Basic编写它。

谢谢!

看着Valyrean组代码后,我已经编辑它归结为这样:

Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer) 
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Integer, ByVal wMapType As Integer) As Integer 

Private Sub HoldKeyDown(ByVal key As Byte, ByVal durationInSeconds As Integer) 

    keybd_event(key, MapVirtualKey(key, 0), 0, 0) ' Down 
    Threading.Thread.Sleep((RandNum.Next(1000, 5000))) 
    keybd_event(key, MapVirtualKey(key, 0), 2, 0) ' Up 

End Sub 

我的问题是现在我该怎样改变箭头键被按下并保持?

+0

忽略此编辑 – Norman

+0

FYI'keybd_event()'已过时,被替换为[**'SendInput()'**](HTTPS ://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v = vs.85).aspx) –

回答

-2

你会想要使用System32的keybd事件库。将以下代码添加到您的表单。

Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer) 
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Integer, ByVal wMapType As Integer) As Integer 

Private Sub HoldKeyDown(ByVal key As Byte, ByVal durationInSeconds As Integer) 
    Dim targetTime As DateTime = DateTime.Now().AddSeconds(durationInSeconds) 
    keybd_event(key, MapVirtualKey(key, 0), 0, 0) ' Down 
    While targetTime.Subtract(DateTime.Now()).TotalSeconds > 0 
     Application.DoEvents() 
    End While 
    keybd_event(key, MapVirtualKey(key, 0), 2, 0) ' Up 
End Sub 

然后使用它...

HoldKeyDown(Keys.Up,3) 
+0

感谢您的回应,虽然这可能会工作我寻找的东西尽可能简单。我使用定时器来帮助保持长度;这可以让它更容易吗?我想重复这个箭头的所有方向(上,下,左,右),以便它可能成为一个相当大的工作 – Norman

+0

代码不会变得更大。这很简单...要“保留”另一个键,只需使用另一个键和时间再次调用该功能即可。 – TheValyreanGroup

+0

谢谢请参阅我的编辑:) – Norman