1

以前、 vb.netのキーフックについて質問しました。

私の現在の問題はそのようなものです:

特定のキーのグループが同時に押されるたびに特定のアクションを実行するプログラムを作成しました。プログラムは、バックグラウンドで、またはシステムトレイなどで実行できる必要があります。基本的に、これはフォームのKeyDownイベントのように機能するはずですが、この場合のフォームがすべてです。

.net API内から直接これを行う方法があるかどうかはわかりませんが、ある場合は確かに見つかりませんでした。

4

1 に答える 1

3

キーボードフックは必要ありません。ホットキーを登録する必要があります。実装がはるかに簡単で、システムリソースの要求がはるかに少なくなります。これが例です。最小化された場合、フォームをフォアグラウンドに復元します。複数のキーを登録できることに注意してください。

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
于 2010-02-27T21:18:47.707 に答える