程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Win32開發入門(25):監視剪貼板

Win32開發入門(25):監視剪貼板

編輯:關於C++

自從郭大俠和蓉兒離開桃花島後,最近島比較寂靜,有一種“門前冷落鞍馬稀”的感覺。於是,老 邪就拿出《九陰真經》認真閱讀,同時用迅雷下載經典大劇《漢武大帝》晚上睡覺前看上幾集,老邪一 向是善於向古聖先賢學習。

大家知道,迅雷有一個監視剪貼板的功能,如果發現你復制剪貼板 的內容包含符合迅雷下載地址格式的就彈出新建下載任務窗口。

可能我們也希望在自己的應用 程序中也加入這樣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到剪貼板。如下圖所示。

好了,大功告成,繼續下電影去,拜拜。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved