【问题标题】:Copy text to Clipboard将文本复制到剪贴板
【发布时间】:2013-10-21 16:18:55
【问题描述】:

我正在做 C#/.NET 应用程序。我想在工具栏上创建一个按钮,它基本上会调用 Ctrl+C(复制到剪贴板)。我查看了剪贴板类,但问题是因为我在表单上有多个文本框,我需要扫描哪个有焦点以及是否/被选中的文本,以便从中选择文本等,所以我认为必须有我“单线”解决方案。

有什么想法吗?

(另外,如何在相同的条件下添加所有 3 个:剪切、复制、粘贴到工具栏 - 主窗体上的多个 tekstboxes..)

【问题讨论】:

  • Windows 窗体?还是 WPF?
  • 请注意,如果您有按钮,它会将焦点从文本框移开...根据您的需要,将“复制到剪贴板”按钮与某些/每个文本框相关联可能对用户更友好。
  • 基本上他必须保存最后一个焦点TextBox并在点击Button时复制其文本
  • 如果他使用的是 WinForms,他可以简单地将 ShortcutsEnabled 属性设置为 true
  • 我可以从 toolbox-click-handler 调用快捷方式吗?

标签: c# clipboard


【解决方案1】:

编辑:如果用于 Winforms..

把它放在你的调用函数中:

Clipboard.SetText(ActiveControl.Text);

正如下面 Daniel Abou Chleih 所说:如果您必须与控件交互来调用焦点函数 将更改为该控件。这仅在您通过其他方式调用时才有效。

编辑: 不是单行的,但适用于最后一个活动的 TextBox:

private Control lastInputControl { get; set; }
protected override void WndProc(ref Message m)
{
    // WM_SETFOCUS fired.
    if (m.Msg == 0x0007)
    {
        if (ActiveControl is TextBox)
        {
            lastInputControl = ActiveControl;
        }
    }

    // Process the message so that ActiveControl might change.
    base.WndProc(ref m);

    if (ActiveControl is TextBox && lastInputControl != ActiveControl)
    {
        lastInputControl = ActiveControl;
    }
}

public void CopyActiveText()
{
        if (lastInputControl == null) return;
        Clipboard.SetText(lastInputControl.Text);
}

现在您可以调用 CopyActiveText() 来获取最近失去焦点或当前具有焦点的 TextBox。

【讨论】:

  • 但是当他点击按钮时,文本框失去焦点。还是我错了?
  • 你是对的。在触发点击事件之前,活动控件会发生变化。
【解决方案2】:

如果您使用的是 WinForms,我可能有一个小解决方案来解决这个问题。

创建一个对象来存储您最后选择的文本框

TextBox lastSelectedTextBox = null;

在您的构造函数中,通过使用参数this.Controls 调用AddGotFocusEventHandler-方法,为Form 中的Form 中的每个TextBox 创建一个事件处理程序。

public void AddGotFocusEventHandler(Control.ControlCollection controls)
{
    foreach (Control ctrl in controls)
    {
        if(ctrl is TextBox)
            ctrl.GotFocus += ctrl_GotFocus;

        AddGotFocusEventHandler(ctrl.Controls);
    }
}

并将lastSelectedTextBox 设置为您当前选择的文本框

void c_GotFocus(object sender, EventArgs e)
{
    TextBox selectedTextBox = (TextBox)sender;
    lastSelectedTextBox = selectedTextBox;
}

在按钮的 Click-EventHandler 中检查 selectedText 是否为空并将文本复制到剪贴板:

private void Button_Click(object sender, EventArgs e)
{
    if(String.IsNullOrWhiteSpace(lastSelectedTextBox.SelectedText))
       Clipboard.SetText(lastSelectedTextBox.Text);
    else
       Clipboard.SetText(lastSelectedTextBox.SelectedText);
}

【讨论】:

  • this.Controls 只会返回表单上的控件。不是子控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多