Haré todo lo posible para explicar en detalle lo que estoy tratando de lograr.¿Cómo respaldo y restauro el portapapeles del sistema en C#?
Estoy usando C# con los controladores de ventana IntPtr para realizar una operación de copia CTRL-C en una aplicación externa desde mi propia aplicación C#. Tuve que hacer esto porque no había forma de acceder al texto directamente usando GET_TEXT. Entonces estoy usando el contenido de texto de esa copia dentro de mi aplicación. El problema aquí es que ahora he sobrescrito el portapapeles.
Lo que me gustaría ser capaz de hacer es:
- copia de seguridad del contenido original del portapapeles que podría haber sido marcada por cualquier aplicación que no sea la mía.
- Luego realice la copia y almacene el valor en mi aplicación.
- Restaure los contenidos originales del portapapeles para que el usuario tenga acceso a sus datos originales del portapapeles.
Este es el código que he probado hasta ahora:
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
}
}
estoy usando el System.Windows.Clipboard y no System.Windows.Forms.Clipboard. La razón de esto fue que cuando realicé el CTRL-C, la clase Clipboard de System.Windows.Forms no devolvió ningún dato, pero sí el portapapeles del sistema.
Intenté algunas de las llamadas de usuario de nivel bajo como OpenClipboard, EmptyClipboard y CloseClipboard esperando que me ayudaran a hacer esto, pero hasta el momento sigo recibiendo excepciones COM al intentar restaurar.
Pensé que quizás esto tenía que ver con el parámetro OpenClipboard que está esperando un identificador de ventana IntPtr de la aplicación que quiere tomar el control del portapapeles. Como mencioné que mi aplicación no tiene una GUI, es un desafío. No estaba seguro de qué pasar aquí. Tal vez alguien puede arrojar algo de luz sobre eso?
¿Estoy usando la clase Clipboard incorrectamente? ¿Hay alguna manera clara de obtener el identificador de ventana IntPtr de una aplicación sin GUI? ¿Alguien sabe de una mejor manera de respaldar y restaurar el portapapeles del sistema?
Me encontré con el mismo error y encontré esta publicación. Sin embargo, obtuve este error solo si llamo Clipboard.GetDataObject(). SetData (myData). Funciona bien si llamo Clipboard.SetDataObject (myData). ¿Alguna explicación de por qué? Mi aplicación está basada en WPF si es importante. – newman