Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 多项目解决方案中的常用按键_Vb.net_Winforms_Keyboard Events - Fatal编程技术网

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

Vb.net 多项目解决方案中的常用按键,vb.net,winforms,keyboard-events,Vb.net,Winforms,Keyboard Events,我有多个项目解决方案,需要对该解决方案的所有项目通用一些服务按键。 例如,如果我在任何包含的项目中的任何位置和任何时间按Ctrl+Alt+Right Shift,实际上发生了“某些事情”,我可以立即检测到该击键 对于所有这些项目,我在附加项目中有公共代码,它作为对“common.dll”的引用包含在所有其他项目中,所以这可能是放置此代码的正确位置 关于如何完成该任务以及代码应该是什么样子的,有什么想法吗 我正在考虑在上检测这些击键,但如果没有帮助,我无法做到这一点。 也许不同的解决方案比我想的更

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

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

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

我正在考虑在上检测这些击键,但如果没有帮助,我无法做到这一点。

也许不同的解决方案比我想的更好?

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


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

您应该创建一个“控制器”项目,它有一个键盘挂钩,可能还有一个带有动画的花式托盘图标:)


从这个“中心”项目,将命令传递给其他窗体…

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
(因此它最终会变成这样):

Enum上的
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

与任何换档键相反,专门检测右换档键仍然存在问题。我找不到一个有效的方法来区分它与左换档键,尽管它看起来像是使用RSShift来实现的。一种解决方案可能是使用VK_RSHIFT常量调用Windows API函数GetKeyState(请参阅)。这种情况的历史原因可能与左键和右键的区别有关,左键和右键的区别比未区分的键更晚添加到Windows中。

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
(因此它最终会变成这样):

Enum上的
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

与任何换档键相反,专门检测右换档键仍然存在问题。我找不到一个有效的方法来区分它与左换档键,尽管它看起来像是使用RSShift来实现的。一种解决方案可能是使用VK_RSHIFT常量调用Windows API函数GetKeyState(请参阅)。这种情况的历史原因可能与左右shift键的区别有关,它们是Windows中较迟添加的,而不是未区分的shift键。

对不起,它们是Windows窗体项目还是WPF?Winforms项目。它们是Windows窗体项目还是WPF?Winforms项目,抱歉。这听起来不够聪明,因为我已经有一个公共项目引用了所有其他项目,这些项目包含低级预筛选消息,应该像“hook”一样使用。您的评论听起来不够聪明。你都准备好了,你问怎么做。因此,最后的结论是,你的问题与多个项目无关,你只想知道如何连接键盘?甚至更简单。我已经为解决方案中的所有项目连接了键盘,但我不知道如何识别多个按键,例如左Ctrl+左Alt+右Shift,因为链接的premessagefilter代码一次只能识别一个键,并且我没有“修改器”,或者我有?这听起来不够聪明,因为我已经有一个公共项目引用了所有其他项目,这些项目包含低级预筛选消息,应该像“hook”一样使用。你的评论听起来不够聪明。你都准备好了,你问怎么做。因此,最后的结论是,你的问题与多个项目无关,你只想知道如何连接键盘?甚至更简单。我已经为解决方案下的所有项目连接了键盘,但我不知道如何识别多个按键,例如左Ctrl+左Alt+右Shift,因为链接的premessagefilter代码一次只能识别一个键,并且我没有“修改器”,或者我有?嗨,Stephen。这些看起来很有用,我试试看。现在仍然存在一个问题,如何同时检测LeftControl、LeftAlt和RightShift的按下。条件如果(e.KeyData=Keys.Control或Keys.Alt或Keys.RShiftKey),则。。。传递任何按键。抱歉,我收到错误消息“HasFlag”不是“System.Windows.Forms.Keys”的成员。Net 2.0、Windows 7、VB 2008?…还可以查看使用KeyData而不是KeyCode的最新编辑-我今天玩得不开心!嗨,斯蒂芬。这些看起来很有用,我试试看。现在仍然存在一个问题,如何同时检测LeftControl、LeftAlt和RightShift的按下。条件如果(e.KeyData=Keys.Control或Keys.Alt或Keys.RShiftKey),则。。。传递任何按键。抱歉,我收到错误消息“HasFlag”不是“System.Windows.Forms.Keys”的成员。Net 2.0、Windows 7、VB 2008?…还可以查看使用KeyData而不是KeyCode的最新编辑-我今天玩得不开心!