关于响应 WM_DRAWCLIPBOARD

【MoreWindows工作笔记12】WM_DRAWCLIPBOARD 监视剪切板 有很多程序会监视剪贴板,比如迅雷,这样当你复制一个迅雷下载链接时,迅雷就可以自动启动并创建一个新的下载任务。下面我们就来看看如何实现这个技术。 实现这个技术一共需要4步: 第一步:Add the window to the clipboard viewer chain. 通过SetClipboardViewer()传入窗口句柄,所有监视剪贴板的窗口句柄会组成一 阅读详情
这部分代码监视剪贴板中数据格式,只要剪贴板中数据变化,就在标题栏上显示出所有可识别的数据格式  
  下面是所有该部分的代码,我的至少在Release后可运行,不知能不能解决你的问题  
   
  //   ClipSpyDlg.h   :   header   file  
  //  
   
  #if   !defined(AFX_CLIPSPYDLG_H_INCLUDED_)  
  #define   AFX_CLIPSPYDLG_H_INCLUDED_  
   
  #if   _MSC_VER   >   1000  
  #pragma   once  
  #endif   //   _MSC_VER   >   1000  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CClipSpyDlg   dialog  
   
  class   CClipSpyDlg   :   public   CDialog  
  {  
  //   Construction  
  public:  
  CClipSpyDlg(CWnd*   pParent   =   NULL); //   standard   constructor  
   
  //   Dialog   Data  
  //{{AFX_DATA(CClipSpyDlg)  
  enum   {   IDD   =   IDD_CLIPSPY_DIALOG   };  
  //   NOTE:   the   ClassWizard   will   add   data   members   here  
  //}}AFX_DATA  
   
  //   ClassWizard   generated   virtual   function   overrides  
  //{{AFX_VIRTUAL(CClipSpyDlg)  
  protected:  
  virtual   void   DoDataExchange(CDataExchange*   pDX); //   DDX/DDV   support  
  //}}AFX_VIRTUAL  
   
  //   Implementation  
  protected:  
  HICON   m_hIcon;  
   
  //   Generated   message   map   functions  
  //{{AFX_MSG(CClipSpyDlg)  
  virtual   BOOL   OnInitDialog();  
  afx_msg   void   OnPaint();  
  afx_msg   HCURSOR   OnQueryDragIcon();  
  afx_msg   void   OnDrawClipboard();  
  afx_msg   void   OnDestroy();  
  afx_msg   void   OnChangeCbChain(HWND   hWndRemove,   HWND   hWndAfter);  
  //}}AFX_MSG  
  DECLARE_MESSAGE_MAP()  
  private:  
  HWND   m_hWndNextCBViewer;  
  };  
   
  //{{AFX_INSERT_LOCATION}}  
  //   Microsoft   Visual   C++   will   insert   additional   declarations   immediately   before   the   previous   line.  
   
  #endif   //   !defined(AFX_CLIPSPYDLG_H_INCLUDED_)  
   
  //////////////////////////////////////////////////////////////////////////////////  
  //   ClipSpyDlg.cpp   :   implementation   file  
  //  
   
  #include   "stdafx.h"  
  #include   "ClipSpy.h"  
  #include   "ClipSpyDlg.h"  
   
  #ifdef   _DEBUG  
  #define   new   DEBUG_NEW  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]   =   __FILE__;  
  #endif  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CClipSpyDlg   dialog  
   
  CClipSpyDlg::CClipSpyDlg(CWnd*   pParent   /*=NULL*/)  
  :   CDialog(CClipSpyDlg::IDD,   pParent)  
  {  
  //{{AFX_DATA_INIT(CClipSpyDlg)  
  //   NOTE:   the   ClassWizard   will   add   member   initialization   here  
  //}}AFX_DATA_INIT  
  //   Note   that   LoadIcon   does   not   require   a   subsequent   DestroyIcon   in   Win32  
  m_hIcon   =   AfxGetApp()->LoadIcon(IDR_MAINFRAME);  
   
  //TODO:   变量初始化  
  m_hWndNextCBViewer=NULL;  
  }  
   
  void   CClipSpyDlg::DoDataExchange(CDataExchange*   pDX)  
  {  
  CDialog::DoDataExchange(pDX);  
  //{{AFX_DATA_MAP(CClipSpyDlg)  
  //   NOTE:   the   ClassWizard   will   add   DDX   and   DDV   calls   here  
  //}}AFX_DATA_MAP  
  }  
   
  BEGIN_MESSAGE_MAP(CClipSpyDlg,   CDialog)  
  //{{AFX_MSG_MAP(CClipSpyDlg)  
  ON_WM_PAINT()  
  ON_WM_QUERYDRAGICON()  
  ON_WM_DRAWCLIPBOARD()  
  ON_WM_DESTROY()  
  ON_WM_CHANGECBCHAIN()  
  //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CClipSpyDlg   message   handlers  
   
  BOOL   CClipSpyDlg::OnInitDialog()  
  {  
  CDialog::OnInitDialog();  
   
  //   Set   the   icon   for   this   dialog.     The   framework   does   this   automatically  
  //     when   the   application's   main   window   is   not   a   dialog  
  SetIcon(m_hIcon,   TRUE); //   Set   big   icon  
  SetIcon(m_hIcon,   FALSE); //   Set   small   icon  
   
  //TODO:   将对话框加入剪贴板监视窗口链中  
  m_hWndNextCBViewer=SetClipboardViewer();  
   
  return   TRUE;     //   return   TRUE     unless   you   set   the   focus   to   a   control  
  }  
   
  //   If   you   add   a   minimize   button   to   your   dialog,   you   will   need   the   code   below  
  //     to   draw   the   icon.     For   MFC   applications   using   the   document/view   model,  
  //     this   is   automatically   done   for   you   by   the   framework.  
   
  void   CClipSpyDlg::OnPaint()    
  {  
  if   (IsIconic())  
  {  
  CPaintDC   dc(this);   //   device   context   for   painting  
   
  SendMessage(WM_ICONERASEBKGND,   (WPARAM)   dc.GetSafeHdc(),   0);  
   
  //   Center   icon   in   client   rectangle  
  int   cxIcon   =   GetSystemMetrics(SM_CXICON);  
  int   cyIcon   =   GetSystemMetrics(SM_CYICON);  
  CRect   rect;  
  GetClientRect(&rect);  
  int   x   =   (rect.Width()   -   cxIcon   +   1)   /   2;  
  int   y   =   (rect.Height()   -   cyIcon   +   1)   /   2;  
   
  //   Draw   the   icon  
  dc.DrawIcon(x,   y,   m_hIcon);  
  }  
  else  
  {  
  CDialog::OnPaint();  
  }  
  }  
   
  //   The   system   calls   this   to   obtain   the   cursor   to   display   while   the   user   drags  
  //     the   minimized   window.  
  HCURSOR   CClipSpyDlg::OnQueryDragIcon()  
  {  
  return   (HCURSOR)   m_hIcon;  
  }  
   
  void   CClipSpyDlg::OnDestroy()    
  {  
  //TODO:   从监视链中删除本监视窗口  
  ChangeClipboardChain(   m_hWndNextCBViewer   );  
   
  CDialog::OnDestroy();  
  }  
   
  void   CClipSpyDlg::OnDrawClipboard()    
  {  
  //TODO:   剪贴板内容发生变化  
  CString   sText("ClipSpy-");  
  UINT   CBFormat[]={  
  CF_BITMAP,  
  CF_DIB,  
  CF_DIF,  
  CF_DSPBITMAP,  
  CF_DSPENHMETAFILE,  
  CF_DSPMETAFILEPICT,  
  CF_DSPTEXT,  
  CF_ENHMETAFILE,  
  CF_HDROP,  
  CF_LOCALE,  
  CF_METAFILEPICT,  
  CF_OEMTEXT,  
  CF_OWNERDISPLAY,  
  CF_PALETTE,  
  CF_PENDATA,  
  CF_RIFF,  
  CF_SYLK,  
  CF_TEXT,  
  CF_WAVE,  
  CF_TIFF  
  };  
  char   *FormatName[]={  
  "CF_BITMAP",  
  "CF_DIB",  
  "CF_DIF",  
  "CF_DSPBITMAP",  
  "CF_DSPENHMETAFILE",  
  "CF_DSPMETAFILEPICT",  
  "CF_DSPTEXT",  
  "CF_ENHMETAFILE",  
  "CF_HDROP",  
  "CF_LOCALE",  
  "CF_METAFILEPICT",  
  "CF_OEMTEXT",  
  "CF_OWNERDISPLAY",  
  "CF_PALETTE",  
  "CF_PENDATA",  
  "CF_RIFF",  
  "CF_SYLK",  
  "CF_TEXT",  
  "CF_WAVE",  
  "CF_TIFF",  
  "未知格式或剪贴板中无数据"  
  };  
   
  //打开剪贴板查询格式类型  
  if(   OpenClipboard()   )  
  {  
  CString   sCBAvailableFormat("");  
  int   nFormatNum=sizeof(CBFormat)/sizeof(UINT);  
   
  //枚举类型  
  for(int   i=0;i<nFormatNum;i++)  
  {  
  if(   ::IsClipboardFormatAvailable(   CBFormat[i]   )   )  
  {  
  if(   sCBAvailableFormat.IsEmpty()   )  
  sCBAvailableFormat+=FormatName[i];  
  else  
  sCBAvailableFormat=sCBAvailableFormat+"   &   "+FormatName[i];  
  }  
  }  
   
  if(   !sCBAvailableFormat.IsEmpty()   )  
  sText+=sCBAvailableFormat;//列出有效格式  
  else  
  sText+=FormatName[i];//该格式未知  
   
  ::CloseClipboard();  
  }  
   
  //在标题栏中显示格式  
  SetWindowText(   sText   );  
   
  //传WM_DRAWCLIPBOARD给下一个监视窗口  
  ::SendMessage(m_hWndNextCBViewer,WM_DRAWCLIPBOARD,0,0);  
  }  
   
  void   CClipSpyDlg::OnChangeCbChain(HWND   hWndRemove,   HWND   hWndAfter)    
  {  
  //   TODO:   监视链中窗口发生变动  
  if(   m_hWndNextCBViewer==hWndRemove   )  
  m_hWndNextCBViewer=hWndAfter;  
   
  //传WM_CHANGECBCHAIN给下一个监视窗口  
  ::SendMessage(m_hWndNextCBViewer,WM_CHANGECBCHAIN,  
  (WPARAM)hWndRemove,(LPARAM)hWndAfter);  
  }   
RTL8306MB交换芯片驱动开发避坑指南:从硬件接线到SDK移植全流程解析 本文详细解析了RTL8306MB交换芯片驱动开发的全流程,重点从硬件接线、SDK移植到实战调试。针对RMII模式下的常见问题,特别是TXEN与RXDV信号交叉连接等关键“坑点”,提供了清晰的排查指南和解决方案,旨在帮助嵌入式工程师高效完成网络设备开发。 阅读详情

相关推荐

GD32F450以太网(2-2): PHY芯片IP101GR介绍

IP101是台湾省九阳电子公司生产制造的,符合IEEE 802.3/802.3u标准单端口快速以太网收发器100Mbps和10Mbps操作,它支持自动MDI/MDIX功能,简化网络安装和减少系统维护成本。支持Auto MDI/MDIX已内置4个49.9欧的精密电阻支持中断功能支持 MII/RMII 接口超低功耗

Zhichao_Zhang的博客 1万+

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

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

ASCE1885 2292

WSL2不能上网,Failed to connect to github.com port 443问题解决方案

WSL2不能上网: 问题:ping外网无效 例如:ping www.baidu.com失败 解决方案: 在wsl: $sudo vi /etc/wsl.conf wsl.conf: [network] generateResolvConf = false 在PowerShell: $sudo vi /etc/etc/resolv.conf resolv.conf: # This file was automatically generated by WSL. To stop automatic gen

Jason_Chen__的博客 9525

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

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

ffygvf的博客 272

Java 开发打飞机小游戏(附完整源码)

上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy {

一只独孤的程序猿 1万+

AI奶牛TMR智能饲喂机器人 Qt信创完整项目( 统信/麒麟国产系统直接编译)

内置**犊牛、育成牛、围产牛、泌乳牛、干奶牛**5套标准化饲喂配方;+" 饲喂批次完成|牛群:"+grpText+"|投喂饲料:"+QString::number(ft)+"吨|剩料:"+QString::number(st)+"吨|异常牛:"+QString::number(abCow);cv::putText(frame,"霉变变质饲料禁止饲喂",cv::Point(20,40),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,0,255),2);

寒寒豆豆软件公司的博客 182

OCX控件中如何去响应WM_DRAWCLIPBOARD

OCX控件中如何去响应WM_DRAWCLIPBOARD                         在类中定义: HWND hWndNextViewer                          OnCreate中添加如果想在剪贴板改变时得到通知,登记你的窗口:                          hWndNextViewer = SetClipbo

逍遥骏马 752

机器学习实战——疫情数据分析与预测

机器学习如何做到疫情可视化——疫情数据分析与预测实战 本文将带领大家爬取11个国家以及中国31个省(自治区、直辖市)在2022.0101-2022.06.19的新冠疫情数据。并且采用机器学习模型对2022.6.20-2022.6.30每一天的全国确诊人数、死亡人数、治愈人数进行预测,**做出疫情可视化图形并且求出最终的相关系数R2!...

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 10万+

[转] 关于响应 WM_DRAWCLIPBOARD

这部分代码监视剪贴板中数据格式,只要剪贴板中数据变化,就在标题栏上显示出所有可识别的数据格式 1 // ClipSpyDlg.h : header file 2 // 3 4 #if !defined(AFX_CLIPSPYDLG_H_INCLUDED_) 5 #define AF...

weixin_30509393的博客 248

uniapp(全端兼容) - 超详细接入百度统计功能,给uniapp全平台各端项目引入添加百度统计的插件统计流量详细的步骤教程(提供最新的百度统计源代码,详细的示例代码复制粘贴即可快速搞定!)

uniapp h5 app 使用加入接入百度统计,uniapp百度统计,uniapp详细引入百度统计的教程,uniapp接入百度统计,uniapp如何实现加入百度的统计代码,uniapp怎么植入百度统计详细教程,uniapp如何对接百度统计,uniapp百度统计不生效怎么办,uniapp使用百度统计不生效常见问题,uniapp引入百度统计后没有生效,uniapp h5网页接入百度统计代码后没有统计无效,uniapp最新接入使用百度统计功能,uniapp增加百度统计代码,uniapp app如何接入百度统计,

✅ 精选推荐文章 1万+

【PINN物理信息网络】基于PINN物理信息网络求解泊松方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解泊松方程(python)

k8291121的博客 2811

剪贴板(下)-剪贴板查看器

//要成为剪贴板查看器必须做到以下几点//1.调用SetClipboardViewer,把自己加入到剪贴板查看器链//在这一步中, 要保存在这条链中,紧跟自己后面的剪贴板查看器的窗口句柄//2.加入了剪贴板查看器链,在适当时候就必须退出这个链.//所以,在程序退出时,调用ChangeClipboardChain把自己从剪贴板查看器链移除//3.处理由于其他剪贴板查看器的上述操作引起的消息 WM

cleverd 3147

Yolov8-pose关键点检测:loss优化 | LRM loss困难样本挖掘,提升难样本、遮挡物等检测精度

LRM loss应用到能够大幅提升pose遮挡物性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1714

c# 监控剪贴板事件

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text

爱拼才会赢 3205

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

keep_moving_cqu的专栏 5870

简易剪贴板查看器

//引用MSDN上的注释 The SetClipboardViewer function adds the specified window to the chain of clipboard viewers. Clipboard viewer windows receive a WM_DRAWCLIPBOARD message whenever the content of th

zgl7903的专栏 2352

Create a Windows Clipboard Monitor in C# using SetClipboardViewer

Introduction Applications such as GetRight and ClipMate seem to magically know when something is copied to the Clipboard. How is it done? This example shows you how to use the Win32 API functio

Freewind的专栏 1989

delphi 剪切板变量_delphi剪切板-监视剪贴板

unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls,Clipbrd, jpeg; //Clipboard使用typeTForm1 = class(TForm)Image1: TImage;ListBo...

weixin_31270363的博客 398

监视剪贴板

使用一些下载工具比如FlashGet、DuDu下载器,通常有一个选项叫做监视剪贴板,如果发现指定类型的后缀名,则自动开始下载,监视剪贴板的小技巧很有实用价值。下面就说说监视剪贴板的小技巧。Windows系统使用list或者是chain来保存当剪贴板的数据发生变化的时候要求被通知到的一些窗口。每一次当剪贴板的数据发生变化的时候,这个list的第一个窗口收到一个WM_DR...

weixin_33995481的博客 114

在应用程序中监视剪贴板的变化和内容

在应用程序中监视剪贴板的变化和内容stove@vip.sina.com 剪贴板是Windows中系统级的堆空间,系统中任何一个应用程序对剪贴板都有访问权,可以通过剪贴板消息和使用剪贴板API来读写剪贴板内容。因此使用剪贴板不仅可以在同一个应用程序内交互数据,也可以在不通应用程序之间交互数据。尤其是在不通应用程序之间交互时,应用程序往往需要对剪贴板内容的变化做到实时感知,即应用程序要能监

stovezhang的专栏 1632

delphi 剪切板变量_Delphi操作剪贴板

Windows使用剪贴板观察器和观察链。剪贴板观察器是一个显示剪贴板当前内容的窗口。通常它应该至少能显示三种普通格式的内容:文字CF_TEXT、位图CF_BITMAP、元文件CF_METAFILEPICT。剪贴板观察链是一系列相互独立的剪贴板观察窗口,它们都能够接受当前发送到剪贴板的内容。我们大致按照以下步骤在窗口中处理有关剪贴板的内容。首先,使用SetClipboardViewer(HWND)函...

weixin_33260887的博客 620

Win32编程原理 - 剪切板小程序

Windows界面编程的关键在于捕获和响应各种消息。 最近编写了一个监视剪切板的小程序,总结学到的一些知识。程序的原理很简单,就是当剪切板的内容发生变化时,会向程序发送一个通知,程序每次收到这个通知都做一些处理,完成相应的功能。 具体实现步骤如下。 用SetClipboardViewer函数注册加入剪切板的监视窗口列表,这个列表是一个链表结构,链表中...

weixin_33755649的博客 140

监视剪贴板,查找文本文件中相关内容

公司网络考试很多,很多同事都苦于应付考试事,为了方便,就写了这个小软件,使用VC2010开发,监视剪贴板,从文本文件中查找相应内容,执行后始终浮于最上面,选择考试题目中关键内容后,按Ctrl_C,相应题库就显示出来了。只要有题库,考试不是难事了。 本项目为对话框软件,主要模块如下: 1、将本窗口注册到Clipboard Viewer Chain HWND hwndNextViewer;

非程序员专栏 779

剪贴板中的观察者(Observer)模式

最近因为工作需要,使用到了剪贴板的特殊功能。也翻阅了一些网上介绍的资料,发现要实现类似FlashGet那样下载工具中监视剪贴板的实现方式,对我们程序设计有点借鉴的意义。在Windows提供的剪贴板API中,针对监视这块,提供的是注册机制。主要函数是SetClipboardViewer这个API函数。这个函数的声明是这样的(Delphi):function SetClipboardViewe

大伟的代码空间 707

监视剪贴板数据

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, clipbrd, StdCtrls, ComCtrls, Menus, ExtCtrls, ToolWin; type TF...

dkopg24406的专栏 218
上一篇: 最酷的windows后门
下一篇: sql 2005如何使用被禁止的"xp_cmdshell"
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值