簡體   English   中英

如何使用任務使用Clipboard.GetText?

[英]How to use Clipboard.GetText using a Task?

我正在編寫一個Windows表單應用程序,它可以自動化舊軟件。 為了在該軟件和我的應用程序之間傳輸信息,我使用剪貼板。 單擊舊軟件上的按鈕會將一些信息放入剪貼板。

對於使用Clipboard.GetText,我應該從Windows窗體中調用它。 但我不希望UI線程上的所有內容。

當我在另一個任務中調用Clipboard.GetText時,我說它應該從STAThread調用Clipboard.GetText。

你將不得不改變你的期望。 標准要求是只有UI線程與剪貼板交互。

從技術上講,文檔中提到的實際需求是只有單線程單元(STA)線程才能訪問剪貼板。 因為大多數后台線程(如.NET中的ThreadPool類創建的線程)都是多線程單元(MTA)線程,所以它們無法訪問剪貼板。 您可以通過手動創建自己的STA線程並在其上運行消息泵來解決這個問題,但是使用UI線程要容易得多,這就是每個人都做的事情。

但是,開始嘗試使用剪貼板在兩個進程之間共享信息是一個糟糕的設計。 剪貼板旨在供用戶存儲信息。 你寫入剪貼板的任何內容都會破壞用戶存儲的內容。 如果您的應用程序執行此操作並覆蓋我想要保留的內容,那么我將對您非常憤怒。

進程之間有更好的通信方式; 為各種想法搜索“進程間通信”(縮寫為“IPC”)。

您的UI線程是STA。 但這並不意味着您必須在UI線程中執行所有邏輯。 您可以在后台執行 UI行之外的所有行。 這可以通過將您的Clipboard.GetText調用回來從您的worker thrad調用UI線程(假設您有一個Form或任何其他Control可用 - 在ctrl變量中):

//Do something
Func<string> getClipboardText = delegate() { return Clipboard.GetText(); };
string clipboardText = (string)ctrl.Invoke(getClipboardText);
//Do something else

如果您不想同時使用Windows.Forms或Wpf剪貼板,則可以調用本機剪貼板api,如下所示:

如何在我的控制台應用程序中將字符串復制到剪貼板而不添加對System.Windows.Forms的引用?

從剪貼板獲取字符串的示例

        OpenClipboard(IntPtr.Zero);

        var ptr = GetClipboardData(13);
        var s = Marshal.PtrToStringUni(ptr);
        Marshal.FreeHGlobal(ptr);
        CloseClipboard();

我使用13作為剪貼板類型(CF_UNICODETEXT)完整列表,你可以在這里看到: https ://msdn.microsoft.com/de-de/library/windows/desktop/ff729168(v = vs。85).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM