Я сделаю все возможное, чтобы подробно объяснить, чего я пытаюсь достичь.
Я использую C # с дескрипторами окна IntPtr для выполнения операции копирования CTRL-C во внешнем приложении из моего собственного приложения 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 приложения без графического интерфейса? Кто-нибудь знает лучший способ резервного копирования и восстановления системного буфера обмена?