【MoreWindows工作笔记12】WM_DRAWCLIPBOARD 监视剪切板

原创 2013年12月31日 16:00:23

有很多程序会监视剪贴板,比如迅雷,这样当你复制一个迅雷下载链接时,迅雷就可以自动启动并创建一个新的下载任务。下面我们就来看看如何实现这个技术。


实现这个技术一共需要4步:

第一步:Add the window to the clipboard viewer chain.

通过SetClipboardViewer()传入窗口句柄,所有监视剪贴板的窗口句柄会组成一个链表(后来者靠前)。这样当剪贴板内容发生变化时,Windows系统给给这些窗口发生消息。


第二步:Process the WM_CHANGECBCHAIN message.

当这个监视剪贴板的窗口句柄链表发生变化时,会收到这个消息。每个窗口都应该给下一个窗口传递消息。

这个消息的wParamlParam说明如下:

wParam表示

A handle to the window being removedfrom the clipboard viewer chain

lParam表示

A handle to the next window in thechain following the window being removed. This parameter is NULL if thewindow being removed is the last window in the chain


第三步:Process the WM_DRAWCLIPBOARD message.

当剪贴板数据发送变化时,窗口会依次收到这个消息。


第四步:Remove the window from the clipboard viewer chain before itis destroyed.

当窗口关闭时,应该调用ChangeClipboardChain()来通知Windows系统将自己从监视剪贴板的窗口句柄链表中移除。


代码如下(下载地址:http://download.csdn.net/download/morewindows/6793027

// 【MoreWindows工作笔记12】WM_DRAWCLIPBOARD 监视剪切板
// http://blog.csdn.net/morewindows/article/details/17655429
// By MoreWindows( http://blog.csdn.net/MoreWindows )
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  static HWND s_hwnd_new_clipboard_viewer = NULL;
  static HWND s_hwnd_edit_clipboard_info = NULL;

	switch (message)
	{
	case WM_INITDIALOG:
    // 4-1 Add the window to the clipboard viewer chain. 
    s_hwnd_new_clipboard_viewer = SetClipboardViewer(hDlg);
    // 把hwnd加入监视链,返回上一个加入的窗口句柄,如果是第一个,则返回值为NULL。新加的窗口在链条头部,成为“当前监视器”
		CenterWindow(hDlg);
    s_hwnd_edit_clipboard_info = GetDlgItem(hDlg, IDC_EDIT_CLIPBOARD_INFO);
		return FALSE;

  // 4-2 Process the WM_CHANGECBCHAIN message. 
  case WM_CHANGECBCHAIN:
    if ((HWND)wParam == s_hwnd_new_clipboard_viewer)
      s_hwnd_new_clipboard_viewer = (HWND)lParam;
    else
      SendMessage(s_hwnd_new_clipboard_viewer, message, wParam, lParam);

  // 4-3 Process the WM_DRAWCLIPBOARD message. 
  case WM_DRAWCLIPBOARD:  //剪切板内容发生变化
    if (OpenClipboard(hDlg)) {
      UINT clipboard_format = EnumClipboardFormats(0);
      HGLOBAL global_memory = GetClipboardData(clipboard_format);
      DWORD data_size = GlobalSize(global_memory);
      CloseClipboard();
      WCHAR clipboard_info[1024];
      swprintf(clipboard_info, L"Clipboard\r\n Data Format = %x\r\n Data Address = 0x%x\r\n Data Size = %d", clipboard_format, global_memory, data_size);
      if (clipboard_format == CF_UNICODETEXT) {
        LPCWSTR clipboard_data = (LPCWSTR)GlobalLock(global_memory);
        if (clipboard_data != NULL) {
          wcscat(clipboard_info, L"\r\nData: \r\n");
          WCHAR buffer[1024];
          DWORD data_size = GlobalSize(global_memory);
          for (size_t i = 0; i < data_size; i++)
            buffer[i] = clipboard_data[i];
          buffer[data_size] = L'\0';
          wcscat(clipboard_info, buffer);
        }
      }
      SetWindowTextW(s_hwnd_edit_clipboard_info, clipboard_info);
    }
    return FALSE;

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
		case IDCANCEL:
      // 4-4 Remove the window from the clipboard viewer chain before it is destroyed. 
      ChangeClipboardChain(hDlg, s_hwnd_new_clipboard_viewer);
			EndDialog(hDlg, FALSE);
			return TRUE;
		}
		break;
	}
	return FALSE;
}

运行程序,复制《【霍比特人2:史矛革之战】》的下载链接,然后程序会显示:



最后再列一下目录,方便大家查看。

1.《【MoreWindows工作笔记9OleGetClipboard 访问剪切板的文本内容》

http://blog.csdn.net/morewindows/article/details/17655053

2.《【MoreWindows工作笔记10OleGetClipboard 访问剪切板上的文件信息》

http://blog.csdn.net/morewindows/article/details/17655057

3.《【MoreWindows工作笔记11EnumClipboardFormats剪切板内容的数据格式》

http://blog.csdn.net/morewindows/article/details/17655299

4.《【MoreWindows工作笔记12WM_DRAWCLIPBOARD 监视剪切板》

http://blog.csdn.net/morewindows/article/details/17655429


本文地址:http://blog.csdn.net/morewindows/article/details/17655429   转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows 







版权声明:本文为博主原创文章,未经博主允许不得转载。

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

简介 SetClipboardViewer :将指定窗口加入到剪贴板监听链,返回下一个监听的窗口句柄 WM_CHANGECBCHAIN:当监听链发生改变的时候,剪贴板的消息只会把消息发送给剪贴板监听链...

关于响应 WM_DRAWCLIPBOARD

这部分代码监视剪贴板中数据格式,只要剪贴板中数据变化,就在标题栏上显示出所有可识别的数据格式     下面是所有该部分的代码,我的至少在Release后可运行,不知能不能解决你的问题         ...

C# 操作Clipboard

 C#定义了一个类System.Windows.Forms.Clipboard来简化剪切板操作,这个类有一个静态方法,主要有:Clear 清除剪切板中的所有数据;ContainsData,Contai...

使用API SetClipboardViewer来监视剪贴板

public partial class Form1 : Form  {         private const int WM_DRAWCLIPBOARD = 776;       ...

白话经典算法系列之三 希尔排序的实现

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。   该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别...

【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容

【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容 本文将示范如果通过OLE方式从剪贴板上获取数据,如果该数据是文本内容,则打印该文本内容。...

【MoreWindows工作笔记11】EnumClipboardFormats 剪切板内容的数据格式

【MoreWindows工作笔记11】EnumClipboardFormats 剪切板内容的数据格式 本文将输出剪贴板上的数据地址,数据大小,对文本类型的数据如何直接输出。...

【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息

【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息 当我们复制文件时,会将文件的信息存储在剪贴板中,这个文件信息并不是文件路径的字符串。而是HDROP类型,本...

安卓学习笔记(二)、使用剪切板传递数据

1、 public class MainActivity extends Activity { private Button button; @Override protected ...

监视剪切板

  • 2013年12月31日 16:04
  • 129KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【MoreWindows工作笔记12】WM_DRAWCLIPBOARD 监视剪切板
举报原因:
原因补充:

(最多只允许输入30个字)