我有多个项目解决方案,需要一些服务按键才能在该解决方案的所有项目中使用 例如,如果我按住Ctrl + Alt + Right Shift的任何地方,任何时候在任何包含的项目中实际发生“某事”,我可以立即检测到该击键。
对于所有这些项目,我在其他项目中都有公共代码,它包含在所有其他项目中作为“common.dll”的引用,因此可能是放置此代码的正确位置。
关于如何完成该任务以及该代码应该如何的任何想法?
我正在考虑在PreFilter Message检测这些击键,但我无法在没有帮助的情况下做到这一点 也许是我认为的更好的解决方案?
答案 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)
你应该创建一个'控制器'项目,它有一个键盘钩子,也许是带有动画的花式托盘图标:)
从那个“中心”项目中,将命令传递给其他表单......