关于C#监视剪贴板信息
生活随笔
收集整理的這篇文章主要介紹了
关于C#监视剪贴板信息
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、常規(guī)方法
在C#中,有一個常規(guī)檢測剪貼板的方法,用的是 System.Windows.Forms.Clipboard;
使用起來很簡單,代碼如下:
/// <summary> /// 設(shè)置剪貼板的文本內(nèi)容 /// </summary> /// <param name="s">文本內(nèi)容</param> public static void SetText(string s) {Clipboard.SetDataObject(s ?? ""); }/// <summary> /// 獲取剪貼板中的文本內(nèi)容 /// </summary> /// <returns>返回剪貼板文本</returns> public static string GetText() {IDataObject iData = Clipboard.GetDataObject();return (string)iData.GetData(DataFormats.Text); }/// <summary> /// 獲取剪貼板位圖格式數(shù)據(jù)(比如從畫圖軟件里復(fù)制的圖片……) /// </summary> /// <returns>位圖</returns> public static Bitmap GetBitmap() {IDataObject iData = Clipboard.GetDataObject();//確定此實例中存儲的數(shù)據(jù)是否與指定的格式關(guān)聯(lián),或是否可以轉(zhuǎn)換成指定的格式if (iData.GetDataPresent(DataFormats.Bitmap)){Bitmap bt = (Bitmap)iData.GetData(DataFormats.Bitmap);return bt;}return null; }2、通知檢測剪貼板
常規(guī)方法沒有通知來告訴我們有數(shù)據(jù),所以再來一個帶通知的方案:
這個代碼比較長……
public partial class Form2 : Form {IntPtr nextClipboardViewer;public Form2(){InitializeComponent();nextClipboardViewer = (IntPtr)SetClipboardViewer((int)Handle);}/// <summary>/// 要處理的 WindowsSystem.Windows.Forms.Message。/// </summary>/// <param name="m"></param>protected override void WndProc(ref Message m){// defined in winuser.hconst int WM_DRAWCLIPBOARD = 0x308;const int WM_CHANGECBCHAIN = 0x030D;switch (m.Msg){case WM_DRAWCLIPBOARD:DisplayClipboardData();SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);break;case WM_CHANGECBCHAIN:if (m.WParam == nextClipboardViewer)nextClipboardViewer = m.LParam;elseSendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);break;default:base.WndProc(ref m);break;}}/// <summary>/// 顯示剪貼板內(nèi)容/// </summary>public void DisplayClipboardData(){try{IDataObject iData = new DataObject();iData = Clipboard.GetDataObject();if (iData.GetDataPresent(DataFormats.Rtf))richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf);else if (iData.GetDataPresent(DataFormats.Text))richTextBox1.Text = (string)iData.GetData(DataFormats.Text);elserichTextBox1.Text = "[Clipboard data is not RTF or ASCII Text]";}catch (Exception e){MessageBox.Show(e.ToString());}}/// <summary>/// 關(guān)閉程序,從觀察鏈移除/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form2_FormClosed(object sender, FormClosedEventArgs e){ChangeClipboardChain(Handle, nextClipboardViewer);}#region WindowsAPI/// <summary>/// 將CWnd加入一個窗口鏈,每當(dāng)剪貼板的內(nèi)容發(fā)生變化時,就會通知這些窗口/// </summary>/// <param name="hWndNewViewer">句柄</param>/// <returns>返回剪貼板觀察器鏈中下一個窗口的句柄</returns>[DllImport("User32.dll")]protected static extern int SetClipboardViewer(int hWndNewViewer);/// <summary>/// 從剪貼板鏈中移出的窗口句柄/// </summary>/// <param name="hWndRemove">從剪貼板鏈中移出的窗口句柄</param>/// <param name="hWndNewNext">hWndRemove的下一個在剪貼板鏈中的窗口句柄</param>/// <returns>如果成功,非零;否則為0。</returns>[DllImport("User32.dll", CharSet = CharSet.Auto)]public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);/// <summary>/// 將指定的消息發(fā)送到一個或多個窗口/// </summary>/// <param name="hwnd">其窗口程序?qū)⒔邮障⒌拇翱诘木浔?span id="ze8trgl8bvbq" class="hljs-xmlDocTag"></param>/// <param name="wMsg">指定被發(fā)送的消息</param>/// <param name="wParam">指定附加的消息特定信息</param>/// <param name="lParam">指定附加的消息特定信息</param>/// <returns>消息處理的結(jié)果</returns>[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);#endregion }認(rèn)真看一下并不難理解,這種帶通知的方式更方便操作。
3、代碼
另外代碼打了個包(Form1是方案一,Form2是方案二)
下載
總結(jié)
以上是生活随笔為你收集整理的关于C#监视剪贴板信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有关PHP、HTML单引号、双引号转义以
- 下一篇: 为什么把端口号改为80之后,访问的时候就