【语言-C++】 Clipboard(剪贴板)2-监听剪贴板并直接显示剪贴板内容到窗口

来源:互联网 发布:股票盈亏软件 编辑:程序博客网 时间:2024/05/21 17:09

简介

SetClipboardViewer :将指定窗口加入到剪贴板监听链,返回下一个监听的窗口句柄

WM_CHANGECBCHAIN:当监听链发生改变的时候,剪贴板的消息只会把消息发送给剪贴板监听链的第一个窗口,前面的窗口负责给后面的窗口发送剪贴板的消息,如果有一个窗口没有给后面的窗口发送剪贴板消息,那么后面的窗口接收不到剪切板的消息。

WM_DRAWCLIPBOARD:当剪切板的内容发生改变的时候会调用该消息,用于自定义重绘剪贴板的内容,但是必须调用SetClipboardViewer函数,该消息才会被调用。

C++源码:

映射消息

BEGIN_MESSAGE_MAP(CClipboardDlg, CDialogEx)    ON_WM_CHANGECBCHAIN()    ON_WM_DRAWCLIPBOARD()END_MESSAGE_MAP()

初始化

BOOL CClipboardDlg::OnInitDialog(){    m_hNextClipboard = NULL;    m_hNextClipboard = ::SetClipboardViewer(GetSafeHwnd());    return TRUE;}

声明

class CClipboardDlg : publicCDialogEx{    HWND m_hNextClipboard;    afx_msg void OnChangeCbChain(HWND hWndRemove, HWND hWndAfter);    afx_msg void OnDrawClipboard();};

剪贴板监听链发生改变

void CClipboardDlg::OnChangeCbChain(HWND hWndRemove, HWND hWndAfter){    CDialogEx::OnChangeCbChain(hWndRemove, hWndAfter);     // TODO: 在此处添加消息处理程序代码    if (m_hNextClipboard== hWndRemove)         m_hNextClipboard = hWndAfter;     else if (m_hNextClipboard) //避免下一个窗口接收不到剪贴板的消息        ::SendMessage(m_hNextClipboard, WM_CHANGECBCHAIN,(WPARAM)hWndRemove, (LPARAM)hWndAfter); }

重绘剪贴板内容

void CClipboardDlg::OnDrawClipboard(){    CDialogEx::OnDrawClipboard();    // TODO: 在此处添加消息处理程序代码    HGLOBAL hClipboardData;     // 如果观看链中在当前程序下面存在下一个程序的话     // 就传递一个WM_DRAWCLIPBOARD 消息给它     if(m_hNextClipboard)         ::SendMessage(m_hNextClipboard, WM_DRAWCLIPBOARD,0, 0);     // 打开剪贴板     ::OpenClipboard(GetSafeHwnd());     // 获得剪贴板内容的全局句柄,剪贴板内容格式限制为CF_TEXT 文本格式     hClipboardData = GetClipboardData(CF_TEXT);     // 锁定全局句柄的地址,并赋给CString 型变量m_strContent     CString m_strContent( (char*)(GlobalLock(hClipboardData)));     // 将m_strContent 的内容在编辑框里显示出来     SetWindowText(m_strContent);     // 取消锁定     GlobalUnlock(hClipboardData);     // 关闭剪贴板     ::CloseClipboard();     unsigned int anFormats[] = {CF_TEXT, CF_HDROP};     unsigned int nFormat = GetPriorityClipboardFormat(anFormats, sizeof(anFormats));       if(nFormat == CF_TEXT)     {         HGLOBAL hMem;         ::OpenClipboard(GetSafeHwnd());         if(hMem = ::GetClipboardData(CF_TEXT))         {             LPTSTR lpszText = (LPTSTR)::GlobalLock(hMem);             CString strURL = lpszText;             strURL = strURL.SpanExcluding(L"/r/n");             if(strURL.Left(7).CompareNoCase(L"http://") == 0 ||                 strURL.Left(6).CompareNoCase(L"ftp://")  == 0 ||                 strURL.Left(7).CompareNoCase(L"file://") == 0)             {                                 //m_pListCtrl->InsertItem(0,lpszText);             }             ::GlobalUnlock(hMem);         }          ::CloseClipboard();     }     else if (nFormat == CF_HDROP)     {         HGLOBAL hMem;         CString cstrInfo;         WCHAR szFileName[MAX_PATH];         ::OpenClipboard(GetSafeHwnd());         if(hMem = ::GetClipboardData(CF_HDROP))         {             UINT FileNumber = ::DragQueryFile((HDROP)hMem, -1, NULL, 0); //得到文件数量             for(int i = 0; i < FileNumber; i++)             {                 //获得路径及文件名                 ::DragQueryFile((HDROP)hMem, i, szFileName, sizeof(szFileName));                 cstrInfo = cstrInfo + szFileName;                 cstrInfo = cstrInfo + L"/r/n";             }             SetWindowText(cstrInfo);         }          ::CloseClipboard();     }} 


 

0 0
原创粉丝点击