.net 全局键盘按钮按下事件

.net 全局键盘按钮按下事件,.net,vb.net,.net,Vb.net,我在尝试通过导入和使用外部库中的组件来触发按键事件时遇到了一些问题。我使用它作为跟踪全局prntscreen按键事件的帮助 所以我添加了对我的vb.net项目的引用,正如我从中导入的库一样,它作为一个组件显示在工具栏上。但是,我很难弄清楚如何让按键事件正常工作 Imports Gma.UserActivityMonitor Partial Public Class Main Private Sub Main_Load(sender As Object, e As EventArgs) Hand

我在尝试通过导入和使用外部库中的组件来触发按键事件时遇到了一些问题。我使用它作为跟踪全局prntscreen按键事件的帮助

所以我添加了对我的vb.net项目的引用,正如我从中导入的库一样,它作为一个组件显示在工具栏上。但是,我很难弄清楚如何让按键事件正常工作

Imports Gma.UserActivityMonitor
Partial Public Class Main

Private Sub Main_Load(sender As Object, e As EventArgs) Handles Me.Load

    AddHandler HookManager.KeyDown, AddressOf HookManager_KeyDown


    Me.NotifyIcon1.Visible = True
    Me.WindowState = FormWindowState.Minimized
End Sub

 Private Sub HookManager_KeyDown(sender As Object, e As KeyEventArgs)

    If e.KeyCode = Keys.PrintScreen Then
        Dim img As Image = SnippingTool.Snip()
        PictureBox1.Image = img
    End If
End Sub
End class

这是我添加的用于检测prntsceen按钮按下的代码,但不管它如何被触发,我做错了什么?

打印屏幕键是特殊的,全局钩子无法捕获它。您可以通过pinvoking RegisterHotKey()使其工作。显示所需代码的示例表单:

Imports System.ComponentModel
Imports System.Runtime.InteropServices

Public Class Form1
    Private Sub PrintScreen()
        AppActivate(System.Diagnostics.Process.GetCurrentProcess().Id)
        MessageBox.Show("Print screen key pressed...")
    End Sub

    Protected Overrides Sub OnHandleCreated(e As EventArgs)
        MyBase.OnHandleCreated(e)
        If Not RegisterHotKey(Me.Handle, HOTKEYID, 0, VK_SNAPSHOT) Then Throw New Win32Exception
    End Sub

    Protected Overrides Sub OnFormClosing(e As FormClosingEventArgs)
        MyBase.OnFormClosing(e)
        If Not e.Cancel Then UnregisterHotKey(Me.Handle, HOTKEYID)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_HOTKEY Then
            Dim id = m.WParam.ToInt32()
            If id = HOTKEYID Then PrintScreen()
        End If
        MyBase.WndProc(m)
    End Sub


    ''--- Pinvoke:
    Private Const HOTKEYID As Integer = 0
    Private Const WM_HOTKEY As Integer = &H312
    Private Const VK_SNAPSHOT As Integer = &H2C

    <DllImport("User32.dll")> _
    Private Shared Function RegisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer, ByVal modifiers As Integer, ByVal vk As Integer) As Boolean
    End Function
    <DllImport("User32.dll")> _
    Private Shared Function UnregisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer) As Boolean
    End Function
End Class
导入System.ComponentModel
导入System.Runtime.InteropServices
公开课表格1
专用子打印屏幕()
AppActivate(System.Diagnostics.Process.GetCurrentProcess().Id)
MessageBox.Show(“按了打印屏幕键…”)
端接头
已创建受保护的重写子句柄(e作为事件参数)
MyBase.OnHandleCreated(e)
如果没有注册hotKey(Me.Handle、HOTKEYID、0、VK_快照),则抛出新的Win32Exception
端接头
受保护的覆盖子表单关闭(如FormClosingEventArgs)
MyBase.OnFormClosing(e)
如果不是,则取消注册热键(Me.Handle,HOTKEYID)
端接头
受保护的覆盖子WndProc(ByRef m As System.Windows.Forms.Message)
如果m.Msg=WM\U热键,则
Dim id=m.WParam.ToInt32()
如果id=HOTKEYID,则PrintScreen()
如果结束
MyBase.WndProc(m)
端接头
''--平沃克:
Private Const HOTKEYID为整数=0
Private Const WM_热键为整数=&H312
私有常量VK_快照为整数=&H2C
_
私有共享函数寄存器hotkey(ByVal hwnd作为IntPtr,ByVal id作为Integer,ByVal修饰符作为Integer,ByVal vk作为Integer)作为布尔值
端函数
_
私有共享函数将热键(ByVal hwnd作为IntPtr,ByVal id作为整数)注销为布尔值
端函数
末级

打印屏幕键是特殊的,全局钩子无法捕获它。您可以通过pinvoking RegisterHotKey()使其工作。显示所需代码的示例表单:

Imports System.ComponentModel
Imports System.Runtime.InteropServices

Public Class Form1
    Private Sub PrintScreen()
        AppActivate(System.Diagnostics.Process.GetCurrentProcess().Id)
        MessageBox.Show("Print screen key pressed...")
    End Sub

    Protected Overrides Sub OnHandleCreated(e As EventArgs)
        MyBase.OnHandleCreated(e)
        If Not RegisterHotKey(Me.Handle, HOTKEYID, 0, VK_SNAPSHOT) Then Throw New Win32Exception
    End Sub

    Protected Overrides Sub OnFormClosing(e As FormClosingEventArgs)
        MyBase.OnFormClosing(e)
        If Not e.Cancel Then UnregisterHotKey(Me.Handle, HOTKEYID)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_HOTKEY Then
            Dim id = m.WParam.ToInt32()
            If id = HOTKEYID Then PrintScreen()
        End If
        MyBase.WndProc(m)
    End Sub


    ''--- Pinvoke:
    Private Const HOTKEYID As Integer = 0
    Private Const WM_HOTKEY As Integer = &H312
    Private Const VK_SNAPSHOT As Integer = &H2C

    <DllImport("User32.dll")> _
    Private Shared Function RegisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer, ByVal modifiers As Integer, ByVal vk As Integer) As Boolean
    End Function
    <DllImport("User32.dll")> _
    Private Shared Function UnregisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer) As Boolean
    End Function
End Class
导入System.ComponentModel
导入System.Runtime.InteropServices
公开课表格1
专用子打印屏幕()
AppActivate(System.Diagnostics.Process.GetCurrentProcess().Id)
MessageBox.Show(“按了打印屏幕键…”)
端接头
已创建受保护的重写子句柄(e作为事件参数)
MyBase.OnHandleCreated(e)
如果没有注册hotKey(Me.Handle、HOTKEYID、0、VK_快照),则抛出新的Win32Exception
端接头
受保护的覆盖子表单关闭(如FormClosingEventArgs)
MyBase.OnFormClosing(e)
如果不是,则取消注册热键(Me.Handle,HOTKEYID)
端接头
受保护的覆盖子WndProc(ByRef m As System.Windows.Forms.Message)
如果m.Msg=WM\U热键,则
Dim id=m.WParam.ToInt32()
如果id=HOTKEYID,则PrintScreen()
如果结束
MyBase.WndProc(m)
端接头
''--平沃克:
Private Const HOTKEYID为整数=0
Private Const WM_热键为整数=&H312
私有常量VK_快照为整数=&H2C
_
私有共享函数寄存器hotkey(ByVal hwnd作为IntPtr,ByVal id作为Integer,ByVal修饰符作为Integer,ByVal vk作为Integer)作为布尔值
端函数
_
私有共享函数将热键(ByVal hwnd作为IntPtr,ByVal id作为整数)注销为布尔值
端函数
末级

嘿,它似乎可以在最小化应用程序的情况下工作,但当我将应用程序放入系统托盘时,它会说{“找不到进程”{0}。”}知道如何让它在system traynvm中与应用程序一起工作吗?我刚刚摆脱了appactivate()的东西,现在似乎可以工作了。我希望这与任何重要的事情无关。。我真的不明白这里的代码在做什么,但我可以接受lol,它做了我想要的:DHey它似乎在最小化应用程序的情况下工作,但当我将应用程序放入系统托盘时,它说{“进程”{0}没有找到。}知道如何让它在system traynvm中与应用程序一起工作吗?我刚刚去掉了appactivate()这件事现在似乎奏效了。我希望这与任何重要的事情无关。。我真的不明白这里的代码在做什么,但我可以接受这个lol,它做了我想要的:D