我创建了一个简单的程序,可以在Windows上全局捕获按键。我使用过GetAsyncKeyState()
。这是我的代码。
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Integer) As Short
For i = 65 To 128
If GetAsyncKeyState(i) = -32767 Then
return Chr(i)
End If
Next i
它运作正常。但如果我运行另一个使用GetAsyncKeyState()
的应用程序,我的程序(或我的程序的两个实例)密钥捕获在一起无法正常工作。它捕获了一些键,而不是全部。
例如;如果我键入“stackoverflow”,它会捕获“sakvrow”
问题出在哪里?如何解决问题。
答案 0 :(得分:2)
问题在documentation:
中解释虽然返回值的最低有效位表示自上次查询以来是否按下了键,但由于Windows的先发制人多任务特性,另一个应用程序可以调用GetAsyncKeyState并接收“最近按下”位而不是您的应用程序。返回值的最低有效位的行为严格保留,以便与16位Windows应用程序(非抢占式)兼容,并且不应该依赖。
问:我该如何解决?汉斯在评论中建议,如果你想要某种“键盘记录器”,你应该使用键盘钩子。见WH_KEYBOARD_LL
答案 1 :(得分:0)
点textbox
查看事件
您必须添加timer
集interval
到100才能将此代码添加到其中
Dim result As Integer
For i = 1 To 255
result = 0
result = GetAsyncKeyState(i)
If result = -32767 Then
TextBox1.Text = TextBox1.Text + Chr(i)
End If
Next i