给大家两个消息,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();
}
代码很简单,就不解释了。。