如何使用GetAsyncKeyState实现全局热键?

时间:2013-11-18 10:13:11

标签: vb.net winapi

我创建了一个简单的程序,可以在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”

问题出在哪里?如何解决问题。

2 个答案:

答案 0 :(得分:2)

问:问题出在哪里?

问题在documentation

中解释

虽然返回值的最低有效位表示自上次查询以来是否按下了键,但由于Windows的先发制人多任务特性,另一个应用程序可以调用GetAsyncKeyState并接收“最近按下”位而不是您的应用程序。返回值的最低有效位的行为严格保留,以便与16位Windows应用程序(非抢占式)兼容,并且不应该依赖

问:我该如何解决?

汉斯在评论中建议,如果你想要某种“键盘记录器”,你应该使用键盘钩子。见WH_KEYBOARD_LL

答案 1 :(得分:0)

textbox查看事件 您必须添加timerinterval到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