1. 程式人生 > >C#操作剪下板(Clipboard)

C#操作剪下板(Clipboard)

剪下板是Windows系統提供的功能,從我最早接觸到的Windows 3.2版本開始,就一直帶著了。以前使用C++的時候,是直接使用Windows API對其進行操作的,到了.NET下,在WinForm中也有一個對剪下板的封裝類,即System.Windows.Forms.Clipboard,這個類其實是通過COM元件間接地使用剪下板的,我個人覺得COM是一個設計非常糟糕的東西,難懂坑多還不可移植,但微軟現存的大量程式碼又是基於COM的,所以又無法徹底捨棄,關於不可移植這個並不難理解,前面說了,剪下板是Windows提供的功能,你在Linux下,或者在MacOS下,儘管有類似的功能,但跟Windows的肯定不同,所以最新的.NET Core中是不能使用剪下板功能的。

往剪下板裡存取字串

字串是最最常用的資料物件了,我們就往剪下板裡寫一個字串吧,我總結了一下,見下表:

方法1 Clipboard.SetText(str);  很可能有問題
方法2 Clipboard.SetData(DataFormats.Text,str);  很可能有問題
方法3 Clipboard.SetDataObject(str);  大多數時候沒問題

嗯?怎麼這麼不確定?確實如此,這是我進行了大量試驗的結果,且程式在除錯和非除錯中還有不同的表現,可能出現的異常有以下兩個:

(異常1:COMException)

(異常2:ExternalException)

兩個異常都沒有進一步的提示資訊,異常的原因很類似,就是剪下板訪問不了,而我使用方法3的時候,在非除錯狀態下還沒發現過什麼問題。我實在找不到進一步的規律了,先這樣用吧。

那麼如何從剪下板獲取字串呢?對應的,有兩種方法:

方法1 string str = (string)Clipboard.GetData(DataFormats.Text) 很可能有問題
方法2 string str = Clipboard.GetText(); 大多數時候沒問題

具體原因我同樣不太清楚,這似乎是微軟留下的一個bug,SO上有個討論,可以去看看:

StackOverflow

另外還有兩點需要注意:

  1. 方法3這種往剪下板裡寫文字內容的方式,在這個程式結束之後,剪下板內容將會失效,要使得程式結束後剪下板內容繼續有效的話,得使用Clipboard.SetDataObject(str, true);這個方法,第二個引數true表示讓剪下板內容在程式結束後繼續有效,但我發現加上這個引數之後,增加了出現異常的可能性。
  2. 必須在給程式的入口函式(通常是Main函式)加上STAThreadAttribute這個註解,否則對剪下板的訪問會報錯:在可以呼叫 OLE 之前,必須將當前執行緒設定為單執行緒單元(STA)模式。

往剪下板裡存取自定義資料

C#的物件的資料結構並不能為剪下板所理解,所以你要把你自定義的資料放到剪下板去的話要把它序列化,在實際操作中,是要你提供一個“可序列化”的物件,下面是個簡單的例子:

[Serializable]
public class User {
    public int age { get; set; }
    public string name { get; set; }
}

class Program {
    [STAThread]
    static void Main(string[] args) {
        User userIn = new User();
        userIn.name = "Jack";
        userIn.age = 18;
        Clipboard.SetData("mydata", userIn);
        User userOut = (User)Clipboard.GetData("mydata");
        Console.WriteLine(userOut.name +" | " + userOut.age);
    }
}

注意User這個類前面的Serializable註解,如果沒有這個註解,是沒法成功將物件寫入剪下板的。如果資料比較複雜,可以考慮把資料自行序列化到一個Stream物件去,再把Stream物件寫入剪下板,獲取的時候對Stream物件自行反序列化,還原資料。例子就不寫了。

最後要注意的一點是由於這裡的資料型別是“mydata”,你也可以指定別的名字,這種型別資料只有你自己的程式能讀懂,也就是說,你是不能開啟記事本或者Photoshop,直接把你這個User物件貼上去的。

相關推薦

C#操作(Clipboard)

剪下板是Windows系統提供的功能,從我最早接觸到的Windows 3.2版本開始,就一直帶著了。以前使用C++的時候,是直接使用Windows API對其進行操作的,到了.NET下,在WinForm中也有一個對剪下板的封裝類,即System.Windows.Forms.Clipboard,這個類其實是通過

C# 使用WinApi操作Clipboard

HERE 實現 range 圖片 there oid rto fin retrieve 前言: 最近正好寫一個程序,需要操作剪切板 功能很簡單,只需要從剪切板內讀取字符串,然後清空剪切板,然後再把字符串導入剪切板 我想當然的使用我最拿手的C#來完成這項工作,原因無他,因為.

C++,開啟關閉與使用,ClipBoard

為了解決程序間通訊,比寫txt更小巧的一種方式。 C++裡邊如果不close的話,ctrl+v是用不了剪貼簿的。 #define _AFXDLL #include <iostream&

c++獲取的內容

剪貼簿內建在windows中,並且使用系統的內部資源RAM,或虛擬記憶體來臨時儲存剪下和複製的資訊,可以存放的資訊種類是多種多樣的。剪下或複製時儲存在剪貼簿上的資訊,只有再剪貼或複製另外的資訊 ,或停電、或退出windows,或有意地清除時,才可能更新或清除其內容,即剪貼或

瀏覽器操作

在工作中,有時候會有需求操作剪下板內容(複製、貼上),看了很多種方法,js高程中推薦以下寫法:    1 var EventUtil = { 2 getClipboardText:function(event){ 3

用vue實現複製到 clipboard.js

用vue實現複製到剪下板 通過在網上檢視比較,發現使用clipboard.js是比較理想的手段:1,不用flash,2,外掛很小,壓縮後只有3kb。 關於clipboard.js,官方文件請戳:https://clipboardjs.com。由於文件是英文的

python 開啟關閉或使用,CLipBoard

#encoding=utf-8 import os # def addToClipBoard(text): # command = 'echo ' + text.strip() + '|

Javascript操作資料(支援IE、Chrome、360、搜狗)

近日,專案上需要在WEB頁面上操作剪下板中的資料,經過一頓搜尋,終於找到了一個比較完美的解決辦法。 當然,在實際應用時還要自行修改一下。經過測試,目前支援IE、Chrome、360、搜狗等瀏覽器,其它瀏覽器還未驗證。 <!DOCTYPE HTML PUBLIC "-/

Mac用python操作

翻譯論文時發現有些論文直接複製過來會包含很多換行符,寫了個小方法處理下:去除剪下板原內容的換行符並覆蓋。 import os import subprocess #將當前剪下板的內容輸出到m.t

微信瀏覽器-複製到-clipboard.js外掛

之前寫過一篇部落格,介紹一個複製到剪下板的外掛,ZeroClipboard,什麼都hen好,然而就是不支援微信瀏覽器,我也沒找到什麼解決方案,我就嚴正拒絕了產品經理的需求。 直到今天被產品看到一個其他yin的h5,竟然可以實現複製到剪下板的功能,

【Html】Clipboard.js 實現點選複製,操作

可以使用cdn 或者直接下載 設定好引用路徑(百度雲下載) <script type="text/javascript" src="./dist/clipboard.min.js"></script> html <input type

C++操作

 // 複製資料至剪下板BOOL CopyToClipboard(const char* pszData, const int nDataLen){    if(::OpenClipboard(NULL))    {        ::EmptyClipboard();  

C#實戰小技巧(八):將中的內容儲存為圖片

進行C#開發時,可以將複製到剪下板中的內容轉為HTML檔案,再將HTML頁面轉為圖片進行儲存,示例效果如下。 被複制的Excel表格: 生成的圖片: 實現上述功能的主要程式碼如下,能夠將從Word、Excel、網頁等地方複製的內容匯出,並儲存為圖片。 程式碼:

複製到外掛clipboard.js原始碼解析

clipboard.js 是一個小型的複製到剪下板外掛,只有3kb,非flash 前言 公司專案有用到clipboard.js,由於好奇心順手點開了原始碼看看其究竟是如何實現的,本以為是九曲十八彎錯綜複雜,其實還是挺容易看懂的,所以就分享下讀後感哈哈。 本篇讀後感分為四部分,分別為前言、解析、

命令列如何 copy 檔案內容到clipboard)?

如果你安裝了 npm,可以是使用 clipboard-cli 。安裝方法: $ sudo npm install -g clipboard-cli 拷貝整個檔案的內容到剪下板: $ cat FILENAME | clipboard 輸出剪下板內容: $ clipb

clipboard.js複製文字到

<a title="複製連結地址" id="copyId" data-clipboard-text="${siteUrl}/subject/view.jhtml?id=${subject.id}" ></a> <script type="text/javasc

使用clipboard.js複製頁面內容到

轉自:https://www.cnblogs.com/lkxsnow/p/5372665.html 使用clipboard.js複製頁面內容到剪下板   最近在做一個的智慧客服Web端瀏覽器應用,其中有一項需求是客戶在獲取系統返回的 答案後點擊“複製答案”按鈕將答案複製到系統剪下板。本以

Vue中配合clipboard.js實現點選按鈕複製內容到

需求設定 點選某個按鈕,將設定的目標內容(例如下載連結地址)複製到剪下板,可以在電腦上任何地方貼上 不使用任何框架和使用Flash,以最小的程式碼實現該功能,並能相容所有主流瀏覽器 外掛選擇 clipboard.js: * `NPM方式`:`np

DataGridView 操作

DataGridView.ClipboardCopyMode 屬性被設定為 DataGridViewClipboardCopyMode.Disable 以外的情況時,「Ctrl + C」按下的時候,被選擇的單元格的內容會拷貝到系統剪下板內。格式有: Text, Unico

複製文字的js庫——clipboard.js

首先,載入clipboard.js檔案(我上網找的一個cdn): <script src="https://cdn.rawgit.com/zenorocha/clipboard.js/master/dist/clipboard.min.js">