1

我有多个项目解决方案,并且需要一些服务按键对于该解决方案的所有项目都是通用的。
例如,如果我在任何包含的项目中随时随地按 Ctrl+Alt+Right Shift,“某事”实际上会发生,我可以立即检测到该击键。

对于所有这些项目,我在附加项目中都有公共代码,这些代码包含在所有其他项目中作为对“common.dll”的引用,因此这可能是放置此代码的正确位置。

关于如何完成该任务以及该代码应该是什么样子的任何想法?

我正在考虑在PreFilter Message上检测那些击键,但没有帮助我无法做到这一点。
也许不同类型的解决方案比我认为的更好?

4

2 回答 2

1

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 键。

于 2013-08-16T12:06:49.910 回答
0

你应该创建一个“控制器”项目,它有一个键盘钩子,也许还有一个带有动画的精美托盘图标 :)

从那个“中心”项目中,将命令传递给其他形式......

于 2013-08-16T07:35:10.867 回答