1. 程式人生 > >剪貼簿監控--C++實現

剪貼簿監控--C++實現

給大家兩個訊息,happy的去玩吧:WM_CHANGECBCHAIN 和 WM_DRAWCLIPBOARD。。

原理:剪貼簿有一個監控連結串列,這個連結串列中就是監控了剪貼簿的程式,如果有新的監控程式加入或移出,那麼就會給這個連結串列中每個程式傳送一個訊息WM_CHANGECBCHAIN ,當然這是採用鏈式的傳遞訊息,每個程式負責傳給下一個程式;當剪貼簿中的資料發生變化時,會給我們的視窗傳送一個WM_DRAWCLIPBOARD訊息。

訊息處理函式:

afx_msg void OnChangeCbChain(HWND hWndRemove, HWND hWndAfter);

afx_msg void OnDrawClipboard();

hWndRemove:從監控剪貼簿的列表中刪除的那個視窗控制代碼。

hWndAfter:列表中被移除的那個視窗的下一個視窗控制代碼

HWND m_hNext;
m_hNext=::SetClipboardViewer(this->GetSafeHwnd());  //監控連結串列

void CdrayFilesDlg::OnChangeCbChain(HWND hWndRemove, HWND hWndAfter)
{
	CDialogEx::OnChangeCbChain(hWndRemove, hWndAfter);

	// TODO: 在此處新增訊息處理程式程式碼
	if(m_hNext==hWndRemove)
		m_hNext=hWndAfter;
	else if(m_hNext)
		::SendMessageW(m_hNext,WM_CHANGECBCHAIN,(WPARAM)hWndRemove,(LPARAM)hWndAfter);
}


void CdrayFilesDlg::OnDrawClipboard()
{
	CDialogEx::OnDrawClipboard();

	// TODO: 在此處新增訊息處理程式程式碼
	if(m_hNext)
		::SendMessageW(m_hNext,WM_CHANGECBCHAIN,0,0);
	::OpenClipboard(GetSafeHwnd());
	HANDLE handleData=GetClipboardData(CF_TEXT);
	CString data((char*)handleData);
	m_clipboardData.AddString(data+"\r\n");
	::CloseClipboard();
}
程式碼很簡單,就不解釋了。。