Чтение keydown независимо от активного приложения в vb.net - PullRequest
1 голос
/ 27 февраля 2010

Я задавал вопрос ранее о keyhooks в vb.net.

Моя текущая проблема такая:

Я создал программу, которая должна выполнить определенное действиевсякий раз, когда определенная группа клавиш нажата одновременно.Программа должна быть в состоянии работать в фоновом режиме или в системном трее или что-то.По сути, это должно работать как событие KeyDown в форме, за исключением того, что форма в этом случае - все.

Я не уверен, есть ли способ сделать это непосредственно из .net API, ноесли есть, то я, конечно, не нашел его.

1 Ответ

2 голосов
/ 28 февраля 2010

Это не требует подключения клавиатуры, вам нужно зарегистрировать горячую клавишу. Гораздо проще реализовать и гораздо менее требователен к системным ресурсам. Вот пример, он восстанавливает форму на переднем плане, если она была свернута. Обратите внимание, что вы можете зарегистрировать более одного ключа:

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
...