我们保留了一个菜单项快捷键(Ctrl + Shift + X)以在Windows VB应用程序中弹出另一个表单。但是当用户试图从任何字段中剪切使用(Ctrl + X)文本时,上面的快捷操作会触发并弹出另一个表单。
不确定我们错过了什么或者我们不应该使用(Ctrl + Shift + X)作为快捷方式。
Me.mnuTools.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftX
最糟糕的情况是我们可以改变捷径,但我们希望知道使用捷径是不对的。
请提供您的观点。
答案 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
修改强>
未来的读者:我知道您可以自己定义热键并在KeyDown
或ProcessCmdKey
中调用相应的方法,但我使用上面的方法,以便菜单项仍然可以显示它的CTRL + SHIFT + X
提示。