我正在做 C#/.NET 应用程序。我想在工具栏上创建一个按钮,它基本上会调用 Ctrl+C(复制到剪贴板)。我查看了剪贴板类,但问题是因为我在表单上有多个文本框,我需要扫描哪个有焦点以及是否/被选中的文本,以便从中选择文本等,所以我认为必须有我“单线”解决方案。
有任何想法吗?
(另外,如何添加所有 3:剪切、复制、粘贴到工具栏,在相同的条件下 - 主窗体上的多个 tekstboxes..)
编辑:如果对于 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() 来获取最近失去焦点或当前具有焦点的 TextBox。
如果您使用的是 WinForms,我可能有一个小的解决方案来解决这个问题。
创建一个对象来存储您最后选择的文本框
TextBox lastSelectedTextBox = null;
TextBox
在您的构造函数中Form
,通过使用参数GotFocus
调用-Method,为 -Event 中的每个创建一个 Eventhandler 。AddGotFocusEventHandler
this.Controls
public void AddGotFocusEventHandler(Control.ControlCollection controls)
{
foreach (Control ctrl in controls)
{
if(ctrl is TextBox)
ctrl.GotFocus += ctrl_GotFocus;
AddGotFocusEventHandler(ctrl.Controls);
}
}
并将 设置lastSelectedTextBox
为您当前选择的 TextBox
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);
}