将文本复制到剪贴板

本文关键字:剪贴板 复制 文本 | 更新日期: 2023-09-27 18:36:12

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

有什么想法吗?

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

将文本复制到剪贴板

编辑:如果用于Winforms..

将其放在调用函数中:

Clipboard.SetText(ActiveControl.Text);

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

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

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() 来获取上次失去焦点或当前具有焦点的最新文本框。

如果您使用的是WinForms,我可能会为该问题提供一个小解决方案。

创建一个对象来存储上次选择的文本框

TextBox lastSelectedTextBox = null;

在构造函数中,通过使用参数 this.Controls 调用 AddGotFocusEventHandler -Method 为GotFocus -Event 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 是否为 null,并将文本复制到剪贴板:

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