Windows フォームはキーボード イベントを発生させるため、ウィンドウ メッセージを自分で処理するような低レベルの操作を行う必要はありません。複数のフォームとプロジェクトでアプローチを標準化するには、共通の DLL プロジェクトを作成し、他のすべてのプロジェクトでそのプロジェクトへの参照を追加します。以下のコードの行に沿って、共通プロジェクトに静的クラス (VB のモジュール) を作成します。
Imports System.Windows.Forms
Public Module KeyPressHandler
''' <summary>
''' Connects the <see cref="Form.KeyDown"/> event handler for a specified Windows form
''' </summary>
Public Sub ConnectKeyHandler(form As Form)
AddHandler form.KeyDown, New KeyEventHandler(AddressOf KeyPressHandler.KeyDownHandler)
End Sub
''' <summary>
''' Handles the KeyDown event for a windows form
''' </summary>
Private Sub KeyDownHandler(sender As Object, e As KeyEventArgs)
If (e.KeyData.HasFlag(Keys.Control) AndAlso e.KeyData.HasFlag(Keys.Alt) AndAlso e.KeyData.HasFlag(Keys.Shift)) Then
'' Do whatever you want here
End If
End Sub
End Module
次に、各フォームのコード ビハインドで、コンストラクターに次のコード行を追加します。
Common.KeyPressHandler.ConnectKeyHandler(Me)
(したがって、最終的には次のようになります):
Public Class Form1
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Common.KeyPressHandler.ConnectKeyHandler(Me)
End Sub
End Class
列挙型のHasFlag
メソッドは .NET 4 で追加されたため、それ以前のバージョンを使用している場合、ロジックはもう少し長くなります。
If ((e.KeyData And Keys.Control = Keys.Control) AndAlso (e.KeyData And Keys.Alt = Keys.Alt) AndAlso (e.KeyData And Keys.Shift = Keys.Shift)) Then
任意のシフト キーではなく、右シフト キーを明確に検出することにはまだ問題があります。RShiftを使用することになっているように見えましたが、左シフトキーと区別する有効な方法を見つけることができませんでした。1 つの解決策は、VK_RSHIFT 定数を使用して Windows API 関数 GetKeyState ( http://www.pinvoke.net/default.aspx/user32.getkeystateを参照) を呼び出すことです。これの歴史的な理由は、左シフト キーと右シフト キーの区別が、未分化のシフト キーよりも後で Windows に追加されたことに関係していると思われます。