相关疑难解决方法(0)

如何在C#中备份和恢复系统剪贴板?

我将尽我所能详细解释我正在努力实现的目标.

我正在使用带有IntPtr窗口句柄的C#来从我自己的C#应用​​程序对外部应用程序执行CTRL-C复制操作.我不得不这样做,因为无法使用GET_TEXT直接访问文本.然后我在我的应用程序中使用该副本的文本内容.这里的问题是我现在已经覆盖了剪贴板.

我希望能做的是:

  1. 备份剪贴板的原始内容,该内容可能由我自己以外的任何应用程序设置.
  2. 然后执行复制并将值存储到我的应用程序中.
  3. 然后恢复剪贴板的原始内容,以便用户仍然可以访问他/她的原始剪贴板数据.

这是我到目前为止尝试的代码:

private void GetClipboardText()
{

    text = "";

    IDataObject backupClipboad = Clipboard.GetDataObject();

    KeyboardInput input = new KeyboardInput(this);
    input.Copy(dialogHandle); // Performs a CTRL-C (copy) operation

    IDataObject clipboard = Clipboard.GetDataObject(); 
    if (clipboard.GetDataPresent(DataFormats.Text))
    {
        // Retrieves the text from the clipboard
        text = clipboard.GetData(DataFormats.Text) as string;
    }

    if (backupClipboad != null) 
    {
        Clipboard.SetDataObject(backupClipboad, true); // throws exception
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用System.Windows.Clipboard而不是System.Windows.Forms.Clipboard.原因是当我执行CTRL-C时,System.Windows.Forms中的Clipboard类没有返回任何数据,但系统剪贴板却没有.

我查看了一些低级user32调用,如OpenClipboard,EmptyClipboard和CloseClipboard,希望它们可以帮助我这样做,但到目前为止,我一直在尝试恢复时遇到COM异常.

我想也许这与OpenClipboard参数有关,该参数期望一个想要控制剪贴板的应用程序的IntPtr窗口句柄.由于我提到我的应用程序没有GUI,这是一个挑战.我不知道该在这里传递什么.也许有人可以对此有所了解?

我是否错误地使用了Clipboard类?有没有明确的方法来获取没有GUI的应用程序的IntPtr窗口句柄?有谁知道备份和恢复系统剪贴板的更好方法?

c# backup clipboard restore

14
推荐指数
2
解决办法
6193
查看次数

双击.NET Label控件将其文本复制到Vista +上的剪贴板?

当我在visual studio中搜索整个项目中的"剪贴板"这个词时,我找不到匹配项.

但不知怎的,我的程序似乎正在改变我的剪贴板的内容,以等于我的窗体上的控件的.text属性.怎么会这样?

我已经确定了处理程序,之后我的剪贴板似乎总是被更改,并添加了一个消息框以从剪贴板中获取文本以尝试识别何时可以更改它.

MessageBox.Show(Clipboard.GetText)
Run Code Online (Sandbox Code Playgroud)

即使在子处理事件的顶部,我的剪贴板也已更改为控件的.text属性.这是处理此事件的唯一子,并且剪贴板在此事件后始终更改.

这是一个用vb.net编写的小型winforms项目.

更多信息:

当我点击它时,我的剪贴板被设置为标签的.text属性.标签在这里制作:

For i = 0 To lstTupChildren.Count - 1
    Dim lbl As New Label()
    lbl.Size = New System.Drawing.Size(250, 25)
    lbl.Font = New System.Drawing.Font("Calibri (body)", 10)
    lbl.Text = i + 1 & ". " & lstTupChildren(i).Item1
    lbl.Location = New System.Drawing.Point(0, 25 * i)
    If lstTupChildren(i).Item3 = True Then lbl.BackColor = Color.GreenYellow Else lbl.BackColor = Color.Orange 'sets the colour depending on whether the timesheet is active'
        Me.Controls.Add(lbl)
        AddHandler lbl.DoubleClick, AddressOf subChangeTimesheetState 'adds handler for …
Run Code Online (Sandbox Code Playgroud)

.net c# vb.net

7
推荐指数
1
解决办法
4620
查看次数

标签 统计

c# ×2

.net ×1

backup ×1

clipboard ×1

restore ×1

vb.net ×1