API関数のRegisterHotKeyおよびUnregisterHotKeyを使用してウィンドウハンドルに関連づけられたホットキーを設定・解除する事ができる。 ホットキーを指定する際は、そのキーと修飾キー(ALT, CTRL, SHIFT)及び、ホットキーのIDを指定する必要がある。 ここでは、ホットキーのIDをキーと修飾キーの値から決定している。

また、実際にホットキーが押されたときには、WM_HOTKEYメッセージが送られてくるので、これに対してフォームをアクティブにする記述をすれば、ホットキーが押された時点でフォームをアクティブにすることができる。 なお、ホットキーを識別するためには、lParamの値が指定したホットキーと等しいかを比較する必要がある。

Sponsored Link

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