【语言-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
- 【语言-C++】 Clipboard(剪贴板)2-监听剪贴板并直接显示剪贴板内容到窗口
- 【语言-C++】 Clipboard(剪贴板)1-监听剪贴板更新
- clipboard.js实现内容复制到剪贴板
- 剪贴板(Clipboard)
- Zero Clipboard复制到剪贴板
- clipboard.js 复制到剪贴板
- Android 中将字符串文字内容复制到系统剪贴板并从剪贴板拿出来显示
- 使用clipboard.js实现页面内容复制到剪贴板
- clipboard.js实现无flash复制内容到剪贴板
- 使用clipboard.js实现页面内容复制到剪贴板
- 使用clipboard.js实现页面内容复制到剪贴板
- 浏览器实现复制内容到剪贴板 -- clipboard.js
- 复制内容到剪贴板
- 剪贴板
- 剪贴板
- 剪贴板
- 剪贴板
- 剪贴板
- &&
- C++中类的前置声明
- 根据经纬度获取当前地址
- git 解决主库冲突conflict
- 接口
- 【语言-C++】 Clipboard(剪贴板)2-监听剪贴板并直接显示剪贴板内容到窗口
- 在cmd下运行monkeyrunner时报错Script terminated due to an exception
- 2016 Multi-University Training Contest 3 1010 Teacher Bo(数学)
- html5语义化标签
- caffe学习(一):CIFAR-10
- IT-linux-linux故障排错
- Manacher 算法模板
- iOS 方法调用异常处理流程
- Docker系列之(四):Win10上运行Docker