剪貼簿監控--C++實現
阿新 • • 發佈:2019-01-02
給大家兩個訊息,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(); }