一個簡單的Windows剪貼簿監控程式

來源:互聯網
上載者:User
簡介

這是一個簡單的WinForm組件和WinForm程式,它可以即時的監控使用者對Windows剪貼簿的操作。當使用者複製/剪下時,它會自動記錄使用者複製/剪下的內容。這個程式使用組件來完成,所以你可以很方便的在自己的程式中使用剪貼簿監控組件。當然,目前這個組件很小很簡單,功能還不完善。

使用Win32 API

我們使用Windows API 來註冊我們的程式,使得作業系統會在使用者複製/剪下時通知我們的程式。需要使用一下幾個函數:

·SetClipboardViewer() - 使一個視窗加入到Windows剪貼簿監聽者鏈中。這樣在使用者扶智/剪下時,Windows會給我們的視窗發送一個WM_DRAWCLIPBOARD訊息。而且,當有其他程式加入/退出這個監聽者鏈表時,Windows會給我們的視窗發送一個WM_CHANGECBCHAIN 訊息。注意:當自己的視窗接收到這兩個訊息時,應該使用SendMessage函數來把訊息傳送給下一個監聽者。

·ChangeClipboardChain() - 使一個視窗退出Windows剪貼簿監聽者鏈。注意我們的程式必須調用ChangeClipboardChain函數來退出監聽者鏈表。

·SendMessage() - 發送訊息到其他視窗,以便於Windows剪貼簿監聽者鏈表中訊息的傳遞。

重寫WndProc方法

重寫自己的WndProc方法,以接收Windows訊息。當接收到WM_DRAWCLIPBOARD訊息時,首先要記得把訊息傳送給下一個監聽者。然後就可以處理自己的程式,這裡我們只是觸發一個簡單的事件,把事情交給更高一層來處理。當接收WM_CHANGECBCHAIN時,需要改變監聽者鏈表。並且記著還要發送訊息給下一個監聽者。

        protected override void WndProc(ref Message m)
        {
            switch ((Msgs)m.Msg)
            {
                case Msgs.WM_DRAWCLIPBOARD:
                    if (m_onWork)
                    {
                        Win32.SendMessage(ClipboardViewerNext, m.Msg, m.WParam, m.LParam);

                        if (ClipboardDrawn != null)
                            ClipboardDrawn(this, new ClipboardDrawnEventArgs("Good"));
                    }
                    break;

                case Msgs.WM_CHANGECBCHAIN: 
                    if (m.WParam == ClipboardViewerNext)
                    {
                         ClipboardViewerNext = m.LParam;
                    }
                    else
                    {
                        Win32.SendMessage(ClipboardViewerNext, m.Msg, m.WParam, m.LParam);
                    }
                    break;

                default:
                    break;
            }
            base.WndProc(ref m);
        }
使用組件

為了讓客戶程式更簡單的使用我們的代碼,我們把我們的代碼做成一個組件。在Visual Studio中建立一個整合自Component的組件,並添加代碼,這樣子其他程式使用我們的類庫時,開發人員只需要簡單在設計器上拖動我們的組件,然後在屬性框中簡單的設定,就可以使用了。

注意,這裡有一個問題。Windows訊息只能被視窗接收(這裡是視窗不是表單),包括System.Windows.Forms.Control及整合自Control的類,比如Form等。但是Component並不在這個範圍內,所以嚴格來說Component是不能收到Windows訊息的。所以我這裡採用了一個小辦法,把所有代碼寫在一個自訂Control類中,然後再用Component簡單的封裝了一層。

還有一些自訂的委託、事件和事件參數,用來使我們的組件產生事件。

其他相關

這個程式參考了Mike Hankey的ClipSpy+,這個程式寫的很好,但是好像不是很方別別人使用代碼。

附件

示範程式 /Files/flankerfc/200801003/ClipManager_bin.zip
原始碼 /Files/flankerfc/200801003/ClipManager_src.zip

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.