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

简介

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(); 
    }
}
 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值