API関数のRegisterHotKeyおよびUnregisterHotKeyを使用してウィンドウハンドルに関連づけられたホットキーを設定・解除する事ができる。 ホットキーを指定する際は、そのキーと修飾キー(ALT, CTRL, SHIFT)及び、ホットキーのIDを指定する必要がある。 ここでは、ホットキーのIDをキーと修飾キーの値から決定している。
また、実際にホットキーが押されたときには、WM_HOTKEYメッセージが送られてくるので、これに対してフォームをアクティブにする記述をすれば、ホットキーが押された時点でフォームをアクティブにすることができる。 なお、ホットキーを識別するためには、lParamの値が指定したホットキーと等しいかを比較する必要がある。
Imports System.Runtime.InteropServices Public Class Form1 Inherits System.Windows.Forms.Form ' ホットキーを登録する <DllImport("user32", EntryPoint:="RegisterHotKey")> _ Private Shared Function RegisterHotKey( _ ByVal hWnd As IntPtr, _ ByVal id As Integer, _ ByVal fsModifier As Integer, _ ByVal vk As Integer) _ As Integer End Function ' ホットキーを解除する <DllImport("user32", EntryPoint:="UnregisterHotKey")> _ Private Shared Function UnregisterHotKey( _ ByVal hWnd As IntPtr, _ ByVal id As Integer) _ As Integer End Function ' ホットキーの修飾キー Private Const MOD_ALT As Byte = &H1 Private Const MOD_CONTROL As Byte = &H2 Private Const MOD_SHIFT As Byte = &H4 <Flags()> _ Private Enum KeyModifiers As Integer None = 0 Alt = MOD_ALT Control = MOD_CONTROL Shift = MOD_SHIFT End Enum Dim id As Integer ' ホットキーのID Dim lParam As IntPtr ' WndProc()メソッドでホットキーを識別するためのlParam値 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Alt + Ctrl + Spaceをホットキーに指定する RegisterHotKey(Me.Handle, Keys.Space, KeyModifiers.Alt Or KeyModifiers.Control, id, lParam) End Sub Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing ' 指定したホットキーを解除する UnregisterHotKey(Me.Handle, id) End Sub ' ホットキーの設定を行う Private Function RegisterHotKey(ByVal hWnd As IntPtr, ByVal key As Keys, ByVal modifier As KeyModifiers, ByRef id As Integer, ByRef lParam As IntPtr) As Boolean ' これらの値は戻り値として返される id = CInt(key) Or CInt(modifier) * &H100 lParam = New IntPtr(CInt(modifier) Or CInt(key) * &H10000) ' ホットキーの指定 Dim result As Integer result = RegisterHotKey(hWnd, id, CInt(modifier), CInt(key)) Return (result <> 0) End Function ' ホットキーの入力メッセージを取得する Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) Const WM_HOTKEY As Integer = &H312 If m.Msg = WM_HOTKEY AndAlso m.LParam.Equals(lParam) Then ' フォームをアクティブにする Me.Activate() Else ' 基底クラスでのメッセージ処理 MyBase.WndProc(m) End If End Sub #End Region End Class_ Private Shared Function RegisterHotKey( _ ByVal hWnd As IntPtr, _ ByVal id As Integer, _ ByVal fsModifier As Integer, _ ByVal vk As Integer) _ As Integer End Function ' ホットキーを解除する_ Private Shared Function UnregisterHotKey( _ ByVal hWnd As IntPtr, _ ByVal id As Integer) _ As Integer End Function ' ホットキーの修飾キー Private Const MOD_ALT As Byte = &H1 Private Const MOD_CONTROL As Byte = &H2 Private Const MOD_SHIFT As Byte = &H4 _ Private Enum KeyModifiers As Integer None = 0 Alt = MOD_ALT Control = MOD_CONTROL Shift = MOD_SHIFT End Enum Dim id As Integer ' ホットキーのID Dim lParam As IntPtr ' WndProc()メソッドでホットキーを識別するためのlParam値 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Alt + Ctrl + Spaceをホットキーに指定する RegisterHotKey(Me.Handle, Keys.Space, KeyModifiers.Alt Or KeyModifiers.Control, id, lParam) End Sub Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing ' 指定したホットキーを解除する UnregisterHotKey(Me.Handle, id) End Sub ' ホットキーの設定を行う Private Function RegisterHotKey(ByVal hWnd As IntPtr, ByVal key As Keys, ByVal modifier As KeyModifiers, ByRef id As Integer, ByRef lParam As IntPtr) As Boolean ' これらの値は戻り値として返される id = CInt(key) Or CInt(modifier) * &H100 lParam = New IntPtr(CInt(modifier) Or CInt(key) * &H10000) ' ホットキーの指定 Dim result As Integer result = RegisterHotKey(hWnd, id, CInt(modifier), CInt(key)) Return (result <> 0) End Function ' ホットキーの入力メッセージを取得する Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) Const WM_HOTKEY As Integer = &H312 If m.Msg = WM_HOTKEY AndAlso m.LParam.Equals(lParam) Then ' フォームをアクティブにする Me.Activate() Else ' 基底クラスでのメッセージ処理 MyBase.WndProc(m) End If End Sub #End Region End Class]]>