【语言-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(); } }
相关文章推荐
- 【语言-C++】 Clipboard(剪贴板)1-监听剪贴板更新
- c++builder Delphi 直接使用剪贴板 Clipboard
- 解决IE新开窗口无法显示内容的问题
- 创建一个新的视图窗口来显示已打开的文档中的内容
- 解决IE新开窗口无法显示内容的问题
- 窗口大小改变时,显示内容的处理(正投影情况)
- Android开发_WebView组件使用详解_LoadUrl直接显示网页内容
- 直接修改TWebBrowser显示内容
- (C++)后台运行一个swf文件,不显示flash player窗口
- android广播监听短信并显示内容
- Delphi调试器窗口中为什么变量内容显示不全?
- UltraEdit剪贴板内容有时无法直接粘贴的原因
- C++直接调用IE对话框窗体显示页面
- c++控制台应用程序如何不显示dos窗口
- vb6.0 连接access数据库 并在窗口显示数据内容
- 删除所有语言配置后,桌面的终端窗口不能显示中文文件名
- 用SDK对话框实现改变背景颜色和显示剪贴板中的文本文件内容
- 文本框里显示提示语言,点击可以输入其他内容
- 拖拉时显示窗口内容 不显示窗口内容 如何只显示边框 SystemParametersInfo
- C++教你用代码实现把拷贝的内容放到剪贴板。