【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 立即下载

相关推荐

如何导入su_利用GIS快速生成SU场地模型

01|前言:进入2021年了,希望大家也是一个新的开始。告诫自己多写文章多更新,多读点书多旅行。然而元旦由于出去玩了4天,积累了一些事情要处理,一直没有时间好好写点东西。今天给大家带来的分享主题叫“利用GIS快速生成SU场地模型”。相关的视频方法其实B站上也有,但我相信视频很多人都不会看,我自己也是。直接给大家上操作流程。主要的操作步骤是【获取场地的矢量shp文件】—【导入ArcScen...

weixin_33806859的博客 9813

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

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

ASCE1885 2292

传感器模块的电路艺术:从引脚定义到系统集成的设计哲学

本文深入探讨传感器模块的电路设计艺术,从引脚定义到系统集成的完整设计哲学。重点解析电源管理、信号处理及I2C通信协议等核心电路原理,分享多模块协同中的电源架构、信号完整性和接地策略,为硬件工程师提供实用的系统级设计思维与实战案例。

o1p2q3r的博客 223

关于响应 WM_DRAWCLIPBOARD

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

2512

【操作系统】 Operation System 第一章:概述

B站 陈渝老师 清华大学 https://www.bilibili.com/video/av6538245?from=search&seid=436175425155932048 相关资料(源自B站下方评论区) https://www.shiyanlou.com/courses/221 配套上机实验地址 https://b23.tv/av18273642/p1 这个适合跨考和基础薄弱的 h...

iwanderu的博客 4万+

五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器

本系列文章主要介绍如何在工程实践中使用卡尔曼滤波器,分五个小节介绍: 一.卡尔曼滤波器开发实践之一: 五大公式 二.卡尔曼滤波器开发实践之二: 一个简单的位置估计卡尔曼滤波器 三.卡尔曼滤波器(EKF)开发实践之三: 基于三个传感器的海拔高度数据融合 四.卡尔曼滤波器(EKF)开发实践之四: ROS系统位姿估计包robot_pose_ekf详解 五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器 也就是本文 ...

okgwf的博客 4136

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

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

ffygvf的博客 272

【实战教程】OpenClaw接入MySQL数据库实战指南

本文介绍了在虚拟机Ubuntu中访问宿主机Win11中MySQL数据库的配置方法,重点包括创建远程用户、权限配置和安全设置。首先在MySQL中创建具有只读权限的用户并刷新权限,然后调整服务器设置允许远程连接。文章还提供了某金融机构财富管理系统的数据库设计方案,包含理财产品表、客户表和份额表的核心结构,其中金额字段使用DECIMAL类型确保精度,并设置唯一键约束。文末强调测试环境配置完成后应恢复安全更新模式以保障生产环境安全。

海兰 8696

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

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

少莫千华 4675

零基础入门simulink建模仿真--基于Simulink的QPSK调制与解调仿真建模示例

QPSK是一种相位调制技术,将两个比特映射到一个符号上,每个符号对应四个可能的相位之一(0°、90°、180°、270°)。通过Simulink,我们可以通过模块化的建模方式实现QPSK的调制和解调过程,并观察信号在信道中的传输效果。通过本指南,我们介绍了如何基于Simulink搭建一个完整的QPSK调制与解调仿真模型,并进行仿真和性能评估。背景介绍:理解QPSK调制与解调的基本原理及其应用。所需工具和环境:列出进行QPSK仿真所需的工具和环境。步骤详解。

amy_mhd的博客 1308

Android15车载系统开机冷启动流程源码解析

本文主要介绍Android15车机系统开机冷启动的流程,暂不包含bootloader,仅从kernel开始直至Launcher首页展示。

jidapenglin28的专栏 253

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

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

keep_moving_cqu的专栏 5870

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

SMFA(自调制特征聚合模块): SMFA模块用于协同建模局部和非局部信息,它分为两个分支:一个是EASA(Efficient Approximation of Self-Attention,简化的自注意力分支),用于捕获非局部信息;另一个是LDE(Local Detail Estimation,局部细节估计分支),用于捕获局部细节。EASA通过对输入特征进行下采样,然后利用全局特征的方差进行调制,再与原始特征进行聚合,提取非局部结构信息。LDE分支则通过卷积操作提取输入特征中的高频局部信息。

qq_64693987的博客 2208

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

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

weixin_42150685的博客 943

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

MFC中窗口居中显示

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

YoseZang的博客 1895

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

置顶窗口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、付费专栏及课程。

余额充值