簡介
這是一個簡單的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