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