多项目解决方案中的常用按键

时间:2013-08-16 07:18:44

标签: vb.net winforms keyboard-events

我有多个项目解决方案,需要一些服务按键才能在该解决方案的所有项目中使用 例如,如果我按住Ctrl + Alt + Right Shift的任何地方,任何时候在任何包含的项目中实际发生“某事”,我可以立即检测到该击键。

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

关于如何完成该任务以及该代码应该如何的任何想法?

我正在考虑在PreFilter Message检测这些击键,但我无法在没有帮助的情况下做到这一点 也许是我认为的更好的解决方案?

2 个答案:

答案 0 :(得分: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

在.NET 4中添加了枚举上的HasFlag方法,因此如果您之前使用的是版本,那么逻辑将会更长一些:

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应该这样做。一种解决方案可能是使用VK_RSHIFT常量调用Windows API函数GetKeyState(请参阅http://www.pinvoke.net/default.aspx/user32.getkeystate)。造成这种情况的历史原因可能与左右移位键的区别在于Windows的后续添加而不是无差别的移位键。

答案 1 :(得分:0)

你应该创建一个'控制器'项目,它有一个键盘钩子,也许是带有动画的花式托盘图标:)

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