自從郭大俠和蓉兒離開桃花島後,最近島比較寂靜,有一種“門前冷落鞍馬稀”的感覺。於是,老 邪就拿出《九陰真經》認真閱讀,同時用迅雷下載經典大劇《漢武大帝》晚上睡覺前看上幾集,老邪一 向是善於向古聖先賢學習。
大家知道,迅雷有一個監視剪貼板的功能,如果發現你復制剪貼板 的內容包含符合迅雷下載地址格式的就彈出新建下載任務窗口。
可能我們也希望在自己的應用 程序中也加入這樣XX的功能,其實不難,真的,我用老頑童的人格保證,實現該功能是灰常簡單的。
我們需要完成兩步就行了。
1、調用AddClipboardFormatListener函數,指定哪個窗口 有資格去捕捉剪貼板內容更新的消息。
2、處理WM_CLIPBOARDUPDATE消息,當剪貼板的內容發生 變化後,消息處理程序會收到這條消息通知。
我相信,你一定想到了實現思路了。呵呵,我一 向對於大家的領悟能力是很有信心的,所以,有時候我故意不說那麼明白。其實我們學編程,不能什麼 問題都指望別人幫忙解決,依靠自己去解決問題才是上尚之道。
今天老邪不用C++來做這個例子 ,用什麼?VB,呵呵,其實也可以,只是許多自負的人看不起VB,很可悲;Delphi?還是不要,不然老 頑童會罵人。還是用C#,一來它的語法符合C風格,二來它也可以調用Win32 API。
估計有人會 納悶了,寫Win32程序不是要用C++嗎?干嗎用C#?呵呵,很簡單,因為我是老邪,本來俺練的蓋世武功 就是“旁門左道”,更何況,這年頭,人是以非主流為無上光榮的。今天老邪也想“光榮”一回,免得 蓉兒說我老了,功夫不行了。
而且,我咨詢過相關律師,法律上並沒有規定寫Win32程序一定要 用C++,再說,WinForm本質上也是Win32,而且人家WinForm還可以做Win64呢。
正因為今天的任 務很簡單,所以我忍不住拿出了看家本領——吹牛,是啊,吹牛好啊,人生難得幾回吹。
在處 理WM_CLIPBOARDUPDATE消息之前,一定要先調用AddClipboardFormatListener函數,它的原型如下:
/* c++ */ BOOL WINAPI AddClipboardFormatListener( _In_ HWND hwnd );
參數有且只有一個,就是窗口的句柄,你想讓哪個窗口監控剪貼板,你就把這個窗口的句 柄傳進去。
下面是DllImport
// C# [DllImport("User32.dll")] public extern static bool AddClipboardFormatListener(IntPtr hwnd);
然後,在Form的 構造函數中調用。
public Form1() { InitializeComponent(); AddClipboardFormatListener(this.Handle); }
接著,如何寫消息處理過程呢?重寫WndProc方法。
protected override void WndProc(ref Message m) { if (m.Msg == WM_CLIPBOARDUPDATE) { if (Clipboard.ContainsText()) { string strdata = Clipboard.GetText(); if (strdata.StartsWith("http://") || strdata.StartsWith("https://")) { this.txtOutput.AppendText(string.Format("在{0}剪貼板發生了變化。\r\n" + "包含URI:{1}" + "\r\n---------------------------------------------\r\n", DateTime.Now.ToString("HH:mm:ss"), strdata)); // 返回0表示已經處理消息 m.Result = new IntPtr(0); } } } else { base.WndProc(ref m); } }
最後,可以測試,隨便復制一些URI到剪貼板。如下圖所示。
好了,大功告成,繼續下電影去,拜拜。