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
与任何换档键相比,专门检测右换档键仍然存在问题。我找不到将它与左 shift 键区分开来的工作方法,尽管看起来应该使用 RShift 来做到这一点。一种解决方案可能是使用 VK_RSHIFT 常量调用 Windows API 函数 GetKeyState(请参阅http://www.pinvoke.net/default.aspx/user32.getkeystate )。造成这种情况的历史原因可能与左右 shift 键的区别是 Windows 较晚添加的,而不是未区分的 shift 键。