您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-01 11:49 696 查看

简介

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


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: