2010-02-27 59 views
1

我之前在vb.net问过一个关于keyhooks的问题。无论vb.net中的活动应用程序如何阅读keydown

我现在的问题是这样的:

我创建了应该执行,只要同时按下某个按键组的某个动作的程序。该程序必须能够在后台或系统托盘中运行。基本上,这应该像表单上的KeyDown事件一样工作,除了这种情况下的表单就是一切。

我不确定是否有办法直接从.net API中执行此操作,但是如果存在,我当然还没有找到它。

回答

2

这不需要键盘挂钩,你需要注册一个热键。系统资源实施起来更容易,对系统资源要求也更低。下面是一个例子,如果它被最小化,它将表单恢复到前台。请注意,您可以注册多个键:

Imports System.Runtime.InteropServices 
Imports System.ComponentModel 

Public Class Form1 
    Private Const cHotKeyId As Integer = 0 

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs) 
    '--- Register Ctrl + Shift + U as a hot key 
    If Not RegisterHotKey(Me.Handle, cHotKeyId, MOD_CONTROL + MOD_SHIFT, Keys.U) Then 
     Throw New Win32Exception() 
    End If 
    MyBase.OnLoad(e) 
    End Sub 

    Protected Overrides Sub OnFormClosing(ByVal e As System.Windows.Forms.FormClosingEventArgs) 
    UnregisterHotKey(Me.Handle, cHotKeyId) 
    MyBase.OnFormClosing(e) 
    End Sub 

    Protected Overrides Sub WndProc(ByRef m As Message) 
    Console.WriteLine(m.ToString()) 
    If (m.Msg = WM_HOTKEY AndAlso m.WParam = CType(cHotKeyId, IntPtr)) Then 
     Me.Visible = True 
     If Me.WindowState = FormWindowState.Minimized Then Me.WindowState = FormWindowState.Normal 
     SetForegroundWindow(Me.Handle) 
    End If 
    MyBase.WndProc(m) 
    End Sub 

    '--- P/Invoke declarations 
    Private Const WM_HOTKEY As Integer = &H312 
    Private Const MOD_ALT As Integer = &H1 
    Private Const MOD_CONTROL As Integer = &H2 
    Private Const MOD_SHIFT As Integer = &H4 
    Private Declare Function RegisterHotKey Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifier As Integer, ByVal vk As Integer) As Boolean 
    Private Declare Function UnregisterHotKey Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean 
    Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As IntPtr) As Boolean 

End Class 
+0

我只希望它如果应用程序正在运行,如果没有应用程序没有运行激活。 (有没有办法用你的代码做这件事?)不,我不想要一个键盘钩子,我更喜欢真正的KeyDown事件。 – Cyclone 2010-02-27 21:24:43

+0

不管怎样,它基本上都是我想要的,+1。如果您或其他人能够提供符合我的要求的东西,我仍会保持开放。 – Cyclone 2010-02-27 21:26:21

+0

呃,这只会在应用程序运行时才起作用。如果你想要别的东西,那么你必须更好地解释你的需求。 – 2010-02-27 21:41:50

相关问题