【问题标题】:Capturing the ctrl+V in VB.NET combobox在 VB.NET 组合框中捕获 ctrl+V
【发布时间】:2013-07-31 16:07:17
【问题描述】:

我试图在粘贴到组合框之前删除换行符并用空格替换,因为它会忽略超出行的任何内容。我正在尝试这个:

If e.Modifiers = Keys.Control AndAlso e.KeyValue = Keys.V Then Then
            Clipboard.SetText(Regex.Replace(Clipboard.GetText(TextDataFormat.UnicodeText), "\n", " "))
            e.Handled = True
        End If

我在 KeyDown 事件中执行此操作,但它能够捕获 Ctrl 或 V 但不能同时捕获两者。我尝试了Capture CTRL+V or paste in a textbox in .NEThttp://social.msdn.microsoft.com/Forums/windows/en-US/096540f4-4ad4-4d24-ae12-cfb3e1b246f3/interceptingoverriding-paste-behavior-on-combobox,但没有得到想要的结果。可能我的代码中缺少一些东西。请帮帮我。

我在调试时使用此 Clipboard.GetText().Replace(vbCrLf, " ") 获得所需的值,但我无法设置它。我尝试使用变量来设置它,但即使这样也没有改变。我还尝试清除剪贴板,然后用这个保存修改后的值的变量进行重置。

我正在使用 Winforms,我尝试了这个,但我的剪贴板仍然没有变化:

Private Const WM_PASTE As Integer = &H302
    Protected Overrides Sub WndProc(ByRef m As Message)
        If m.Msg = WM_PASTE Then
            Dim returnText As String = Nothing
            If (Clipboard.ContainsText()) Then
                returnText = Clipboard.GetText().Replace(vbCrLf, " ")
                Clipboard.Clear()
                Clipboard.SetText(returnText)
            End If
        End If
        MyBase.WndProc(m)
    End Sub

【问题讨论】:

  • 你想要这个在 c# 代码还是 vb.net 中?
  • 右键单击 -> 粘贴会发生什么?

标签: vb.net combobox keyboard-shortcuts keyboard-events


【解决方案1】:

仅处理键盘事件以拦截粘贴并不能解决问题,因为粘贴也可以使用鼠标或触摸界面完成。

因此,如果您使用的是 WPF,则只需将 DataObject.Pasting 事件处理程序添加到您的 ComboBox,因此 XAML 中控件的定义将如下所示:

    <ComboBox Name="comboBox1" IsEditable="true" DataObject.Pasting="comboBox1_Pasting" ... />

最后,在您的代码中将其处理为(我在此处向代码隐藏添加了一个方法,这不如使用命令那么好):

    private void comboBox1_Pasting(object sender, DataObjectPastingEventArgs e)
    {
        // modify the clipboard content here
    }

如果您使用的是 WinForms,请看这里:hook on default “Paste” event of WinForms TextBox control

【讨论】:

    【解决方案2】:

    这段代码对我有用:

    Private Const WM_PASTE As Integer = &H302
        Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
            If keyData = (Keys.Control Or Keys.V) Or msg.Msg = WM_PASTE Then
                If (Clipboard.ContainsText()) Then
                    Clipboard.SetText(Clipboard.GetText().Replace(vbCrLf, " "))
                End If
            End If
            Return MyBase.ProcessCmdKey(msg, keyData)
        End Function
    

    【讨论】:

      【解决方案3】:

      使用 keydown 事件并像这样改变剪贴板

      Private Sub ComboBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyDown
          If e.KeyCode = Keys.V AndAlso (e.Modifiers And Keys.Control) <> 0 Then
              My.Computer.Clipboard.SetText(My.Computer.Clipboard.GetText().Replace(vbCrLf, " "))
          End If
      End Sub
      

      但是这个例子会改变剪贴板的内容。修改它以根据需要粘贴或插入自己

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多