Я сделаю все возможное, чтобы подробно объяснить, чего я пытаюсь достичь.
Я использую С# с обработчиками окна IntPtr для выполнения операции копирования CTRL-C во внешнем приложении из моего собственного приложения С#. Я должен был сделать это, потому что не было никакого способа получить доступ к тексту напрямую, используя GET_TEXT. Затем я использую текстовое содержимое этой копии в своем приложении. Проблема здесь в том, что теперь я перезаписал буфер обмена.
Я хотел бы иметь возможность:
- Резервное копирование исходного содержимого буфера обмена, которое могло быть установлено любым другим приложением, отличным от моего.
- Затем выполните копию и сохраните это значение в моем приложении.
- Затем восстановите исходное содержимое буфера обмена, чтобы пользователь по-прежнему имел доступ к своим исходным данным буфера обмена.
Это код, который я пробовал до сих пор:
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
}
}
Я использую System.Windows.Clipboard, а не System.Windows.Forms.Clipboard. Причина этого заключалась в том, что когда я выполнял CTRL-C, класс Clipboard из System.Windows.Forms не возвращал никаких данных, но сделал системный буфер обмена.
Я просмотрел некоторые низкоуровневые вызовы user32, такие как OpenClipboard, EmptyClipboard и CloseClipboard, надеясь, что они помогут мне это сделать, но до сих пор я продолжаю получать исключения COM при попытке восстановить.
Я подумал, что, возможно, это связано с параметром OpenClipboard, который ожидает дескриптор окна IntPtr приложения, который хочет взять управление буфером обмена. Поскольку я упоминал, что мое приложение не имеет графического интерфейса, это вызов. Я не был уверен, что мне нужно здесь пройти. Может быть, кто-то может пролить свет на это?
Я неправильно использую класс Clipboard? Есть ли четкий способ получить дескриптор окна IntPtr приложения без GUI? Кто-нибудь знает, как лучше создать резервную копию и восстановить системный буфер обмена?