Ctrl + Shift + X与Ctrl + X操作冲突

时间:2017-06-30 06:01:59

标签: vb.net

我们保留了一个菜单项快捷键(Ctrl + Shift + X)以在Windows VB应用程序中弹出另一个表单。但是当用户试图从任何字段中剪切使用(Ctrl + X)文本时,上面的快捷操作会触发并弹出另一个表单。

不确定我们错过了什么或者我们不应该使用(Ctrl + Shift + X)作为快捷方式。

Me.mnuTools.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftX

最糟糕的情况是我们可以改变捷径,但我们希望知道使用捷径是不对的。

请提供您的观点。

1 个答案:

答案 0 :(得分:0)

我无法回答为什么它认为 CTRL + X 应该调用 CTRL + SHIFT + X 热键,但我相信我有一个解决方法。

执行剪切操作时,Windows会向焦点控件发送WM_CUT消息。如果我们覆盖ProcessCmdKey(),我们可以阻止 CTRL + X 组合到达表单的任何子控件,而是自己发送WM_CUT消息。

未经测试,但我相信它应该有效:

<DllImport("user32.dll")> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr)
End Function

Private Const WM_CUT As Integer = &H300

Protected Overrides Function ProcessCmdKey (ByRef msg As Message, keyData As Keys) As Boolean
    If keyData = (Keys.ControlKey Or Keys.X) AndAlso _
         Me.ActiveControl IsNot Nothing Then
        SendMessage(Me.ActiveControl.Handle, WM_CUT, IntPtr.Zero, IntPtr.Zero) 'Send the WM_CUT message to the currently focused control.
        Return True 'Indicate that we've handled the message and stop the key strokes from reaching any child controls.
    End If
End Function

修改

未来的读者:我知道您可以自己定义热键并在KeyDownProcessCmdKey中调用相应的方法,但我使用上面的方法,以便菜单项仍然可以显示它的CTRL + SHIFT + X提示。