¿Cómo puedo obtener el texto del portapapeles en un hilo no estático? Tengo una solución pero estoy tratando de obtener la manera más limpia/más corta posible. Los resultados aparecen como una cadena vacía al llamarlo normalmente.C# Clipboard.GetText()
Respuesta
intento de añadir el ApartmentStateAttribute a su principal método
[STAThread]
static void Main() {
//my beautiful codes
}
Usted no puede; debe especificar el STAThread
attribute.
Nota:
ThreadStateException
El hilo actual no está en modo de apartamento de subproceso único (STA). Agregue el
STAThreadAttribute
al método Principal de su aplicación.
No sé cuáles son sus definiciones de limpio o corto, pero si está dispuesto a utilizar la plena confianza, puede simplemente P/invocar las funciones nativas del portapapeles para evitar los problemas de subprocesamiento. He aquí un programa completo para imprimir el texto en el portapapeles:
using System;
using System.Runtime.InteropServices;
namespace PasteText
{
public static class Clipboard
{
[DllImport("user32.dll")]
static extern IntPtr GetClipboardData(uint uFormat);
[DllImport("user32.dll")]
static extern bool IsClipboardFormatAvailable(uint format);
[DllImport("user32.dll", SetLastError = true)]
static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll", SetLastError = true)]
static extern bool CloseClipboard();
[DllImport("kernel32.dll")]
static extern IntPtr GlobalLock(IntPtr hMem);
[DllImport("kernel32.dll")]
static extern bool GlobalUnlock(IntPtr hMem);
const uint CF_UNICODETEXT = 13;
public static string GetText()
{
if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
return null;
if (!OpenClipboard(IntPtr.Zero))
return null;
string data = null;
var hGlobal = GetClipboardData(CF_UNICODETEXT);
if (hGlobal != IntPtr.Zero)
{
var lpwcstr = GlobalLock(hGlobal);
if (lpwcstr != IntPtr.Zero)
{
data = Marshal.PtrToStringUni(lpwcstr);
GlobalUnlock(lpwcstr);
}
}
CloseClipboard();
return data;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Clipboard.GetText());
}
}
}
Tantas limitaciones en el uso de la clase ClipBoard .NET, esta es la mejor solución que encontré, gracias. –
me gustaría añadir un método de ayuda que se puede ejecutar una acción como un subproceso STA dentro de un subproceso MTA principal. Creo que esa es probablemente la forma más limpia de lograrlo.
class Program
{
[MTAThread]
static void Main(string[] args)
{
RunAsSTAThread(
() =>
{
Clipboard.SetText("Hallo");
Console.WriteLine(Clipboard.GetText());
});
}
/// <summary>
/// Start an Action within an STA Thread
/// </summary>
/// <param name="goForIt"></param>
static void RunAsSTAThread(Action goForIt)
{
AutoResetEvent @event = new AutoResetEvent(false);
Thread thread = new Thread(
() =>
{
goForIt();
@event.Set();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
@event.WaitOne();
}
}
- 1. Clipboard.GetText devuelve un valor nulo (cadena vacía)
- 2. C# Enviando comandos de teclado a otra ventana/proceso
- 3. Biblioteca Eye-Tracking en C#, C/C++ u Objective-C
- 4. C vs C++ (Objective-C vs Objective-C++) para iPhone
- 5. Analizadores léxicos basados en C/C++/C#
- 6. C-string definición en C/C++
- 7. Managed C++ (C++/CLI) vs C#/VB.NET
- 8. main() en C, C++, Java, C#
- 9. C# y Visual C#?
- 10. Derivados en C/C++?
- 11. Llamando C# desde C
- 12. error C/C++ preprocesamiento
- 13. C/C++ puzzle API
- 14. Envolvedora C para C++
- 15. C# y C++ Library
- 16. C++ union en C#
- 17. C/C++ Puntero Pregunta
- 18. C/C++ en Android?
- 19. C/C++ Image Loading
- 20. Combinando C++ y C#
- 21. biblioteca c/C++ NLP
- 22. C++
- 23. C#
- 24. Extendiendo Python con C/C++
- 25. C++/CLI: Ventajas sobre C#
- 26. ¿Generar contenedor C desde C++?
- 27. Bitwise O: C# contra C++
- 28. static vs extern "C"/"C++"
- 29. C++ ¿Bibliotecas similares a C#?
- 30. C/C++ preguntas de codificación
No creo que esta sea la manera prevista. – BitKFu
+1 para // mis hermosos códigos –