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

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

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


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

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

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


第二步:Process the WM_CHANGECBCHAIN message.

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

这个消息的wParam和lParam说明如下:

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.youkuaiyun.com/download/morewindows/6793027)

// 【MoreWindows工作笔记12】WM_DRAWCLIPBOARD 监视剪切板
// http://blog.youkuaiyun.com/morewindows/article/details/17655429
// By MoreWindows( http://blog.youkuaiyun.com/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工作笔记9】OleGetClipboard 访问剪切板的文本内容》

http://blog.youkuaiyun.com/morewindows/article/details/17655053

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

http://blog.youkuaiyun.com/morewindows/article/details/17655057

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

http://blog.youkuaiyun.com/morewindows/article/details/17655299

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

http://blog.youkuaiyun.com/morewindows/article/details/17655429


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

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







窗体居中 vc CenterWindow 窗体居中显示 vc CenterWindow 窗体居中 vc CenterWindow 窗体居中 vc CenterWindow 立即下载

相关推荐

OpenCV透视变换实战:5分钟搞定歪斜证件照矫正(附完整代码)

本文详细介绍了如何使用OpenCV的透视变换技术快速矫正歪斜证件照,包含完整的Python代码实现。通过特征检测、坐标计算和矩阵变换三个核心步骤,5分钟内即可将手机拍摄的歪斜图像自动矫正为专业级证件照,大幅提升图像处理效率。

weixin_29094979的博客 481

《Windows核心编程》---剪贴板

<br />剪贴板是由系统定义的,并不属于任何一个特定的进程。系统中所有进程都可以访问和设置剪贴板。剪贴板最大的特点就是数据传输没有明确的目标,数据是被动访问的;剪贴板的内容可以被多次访问,直到新的数据写入。剪贴板是一种可供选择的进程间通信方式,但由于系统中任何一个进程都可以都可以无限制地访问剪贴板,因此,它是一种不可靠的通信方式。<br />1)获取和设置剪贴板数据<br />涉及到的API有:OpenClipboard、EmptyClipboard、SetClipboardData、GetClipboa

ASCE1885 2292

Android Qcom Display学习(十一)

该系列文章总目录链接与各部分简介:本章主要是基于MIPI Payload传输接口的学习,包括Generic和DCS的接口不同。底层都是基于去封装的,下面第一部分调用原生接口,第二部分分析高通是如何进行读写操作的。

Android驱动开发 3179

关于响应 WM_DRAWCLIPBOARD

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

2512

STM32—时钟树(结合系统时钟函数理解)

时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32...

肥宅快乐博客 1万+

深信服桌面云实战:从零部署到高效运维的关键配置指南

本文提供了一份深信服桌面云从零部署到高效运维的实战指南。内容涵盖项目启动阶段的资源、网络与存储规划,详细演示了VMP与VDC平台的安装与对接,并深入讲解了制作虚拟机模板、配置用户体系、优化终端策略等核心步骤。最后,分享了包括CPU公平分配、智能调度在内的关键性能调优与高阶运维技巧,旨在帮助管理员构建稳定、高效的云桌面环境。

blockchain9miner的博客 451

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

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

ffygvf的博客 272

scratch lenet(4): 开根号的C语言实现

使用C语言,分别使用二分法、牛顿法、卡马克快速法,求解正实数的开根号。包括公式推导、代码实现、运行结果,不使用任何第三方库和C标准库的数学库。

baiyu33的博客 4969

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

简介 SetClipboardViewer :将指定窗口加入到剪贴板监听链,返回下一个监听的窗口句柄 WM_CHANGECBCHAIN:当监听链发生改变的时候,剪贴板的消息只会把消息发送给剪贴板监听链的第一个窗口,前面的窗口负责给后面的窗口发送剪贴板的消息,如果有一个窗口没有给后面的窗口发送剪贴板消息,那么后面的窗口接收不到剪切板的消息。 WM_DRAWCLIPBOARD:当剪切板的内容发生

少莫千华 4675

软件工程导论实践:从需求到架构的机票预订系统全流程解析

本文深入解析机票预订系统从需求分析到架构设计的全流程实践,涵盖业务流程、功能建模、模块化设计、性能优化等关键环节。通过实际项目经验,分享软件工程导论在复杂系统开发中的应用技巧,包括数据流图绘制、E-R图设计、微服务架构及高并发处理等实战策略,助力开发者构建高效可靠的机票预订系统。

weixin_29202213的博客 412

手把手教你学Simulink——基于经典PID控制的电机系统场景实例:步进电机PID位置控制系统的实现

步进电机(Stepper Motor)是一种将电脉冲信号转化为角位移的执行元件,具有结构简单、控制方便、定位精度高等优点,广泛应用于数控机床、机器人、打印机、3D打印机等需要精确定位的场合。传统的步进电机多采用开环控制,但在高速或负载变化较大的情况下容易出现丢步、振荡等问题。为提高控制精度与响应性能,闭环PID控制被引入步进电机的位置控制中,通过编码器或旋转变压器等反馈装置,实现高精度、高稳定性的位置控制。本教程将带你使用构建一个基于PID控制的步进电机位置控制系统仿真模型步进电机建模。

MHD0815的博客 9688

剪贴板监控--C++实现

给大家两个消息,happy的去玩吧:WM_CHANGECBCHAIN 和 WM_DRAWCLIPBOARD。。 原理:剪贴板有一个监控链表,这个链表中就是监控了剪贴板的程序,如果有新的监控程序加入或移出,那么就会给这个链表中每个程序发送一个消息WM_CHANGECBCHAIN ,当然这是采用链式的传递消息,每个程序负责传给下一个程序;当剪贴板中的数据发生变化时,会给我们的窗口发送一个WM_DRA

keep_moving_cqu的专栏 5870

lammps案例:聚乙烯和石墨烯界面pull out模拟

大家好,我是小马老师。 本文介绍lammps模拟计算界面结合力的一个案例。 本案例参考论文《The interfacial mechanical properties of functionalized graphene- polymer nanocomposites》,对论文作者表示感谢。 模型共分2层,上层为聚乙烯模型,下次为单层石墨烯,模拟过程共分3部分:建模、弛豫、拉伸。 (1)建模 使用MS建立聚乙烯和石墨烯模型,具体方法可参考之前的推文,使用build layer方法建立聚乙烯和石墨烯组合模型,

lammps_jiayou的博客 3493

vb.net剪切板监控(配合消息钩子)

剪切板监控技术可以实现类似迅雷复制链接提示下载的功能,鉴于vb.net少人写例子,这里我就写一个简单的例子。

weixin_42150685的博客 943

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MFC中窗口居中显示

对于一个窗体,可以使用其CenterWindow方法将其居中,CenterWindow方法有一个参数,通过其指定居中操作相对应的父窗口。如果要设置居中相对应的父窗体的话,可以将父窗体指针传入pAlternateOwner参数,如果pAlternateOwner参数为NULL,则将窗体在整个屏幕上居中。方法中调用,用于在窗口开始显示时居中,也可以在其他地方使用。方法有一个参数,通过其指定居中操作相对应的父窗口。对于一个窗体,可以使用其。

YoseZang的博客 1895

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

置顶窗口SetWindowPos()的用法

SetWindowPos()        函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。        函数原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,in

熊小屁的专栏 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一个更好的CenterWindow()函数

下载演示项目- 42.2 kb图1。主CenterSample程序示例屏幕。 介绍 定心窗口在屏幕上是你通常可以做的 CWnd::CenterWindow()函数在MFC。CenterWindow () 获取一个指向CWnd的指针作为参数,并且假定是函数 是否会将调用它的窗口的中心与传递它的窗口相对 一个指针: 隐藏,复制CodepDlg->CenterWindow(AfxGetMainWnd()); // Centers pDlg against the main window? 清单1。演示使用C

DiyAbc 898

IsIconic、CenterWindow()的用法 、LockWindowUpdate、CredUIParseUserName

一、Isiconic 功能 函数功能:该函数确定给定窗口是否是最小化(图标化)的窗口。函数原型:BOOL IsIconic(HWND hWnd); hWnd:被测试窗口的句柄。 返回值:如果窗口未最小化,返回值为零;如果窗口已最小化,返回值为非零。 函数isiconic返回值取决于指定窗口是否已经最小化。 BOOL IsIconic(

chenyujing1234的专栏 3179

CenterWindow()的用法

周后南 1801

CenterWindow()和CenterWindow(GetDesktopWindow())区别

  今天做了一下CenterWindow()和CenterWindow(GetDesktopWindow())区别测试,发现CenterWindow()获取的界面区域是不包括任务栏的,而CenterWindow(GetDesktopWindow())的界面区域时包括任务栏的。CWnd::CenterWindow void CenterWindow( CWnd* pAlternateOwner = NULL ); HWND WINAPI GetDesktopWindow(void); //返回窗口

JKhuang的专栏 1851

MFC中CenterWindow()函数的模拟

  void CenterWindow(HWND hWnd){    HWND hParentOrOwner;    RECT rc, rc2;    int    x,y;    if((hParentOrOwner=GetParent(hWnd))==NULL)    {        SystemParameters

knock的专栏 2717

《Windows程序设计》之剪贴板查看器

注意的几点问题: 1、WM_DRAWCLIPBOARD 与WM_PAINTCLIPBOARD的区分,WM_PAINTCLIPBOARD是由剪贴板查看器发给使用CF_OWNERDISPLAY剪贴板格式的程序的。 WM_DRAWCLIPBOARD则是由Windows发给当前剪贴板查看器的。 2、当程序想从剪贴板查看器链中退出时,必须调用ChangeClipboardChain,Windows会向

倒计时 1071
上一篇: 【MoreWindows工作笔记11】EnumClipboardFormats 剪切板内容的数据格式
下一篇: 停博一年
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值