剪贴板监控--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();
}
代码很简单,就不解释了。。

你可能感兴趣的:(C++)