我是靠谱客的博主 老实砖头,最近开发中收集的这篇文章主要介绍【语言-C++】 Clipboard(剪贴板)2-监听剪贴板并直接显示剪贴板内容到窗口简介C++源码:,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
简介
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();
}
}
最后
以上就是老实砖头为你收集整理的【语言-C++】 Clipboard(剪贴板)2-监听剪贴板并直接显示剪贴板内容到窗口简介C++源码:的全部内容,希望文章能够帮你解决【语言-C++】 Clipboard(剪贴板)2-监听剪贴板并直接显示剪贴板内容到窗口简介C++源码:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复