开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 648|回复: 3
收起左侧

[精币悬赏] 用 bitBlt 函数获取透明分层窗口的图像怎么写?

[复制链接]
结帖率:57% (4/7)
发表于 2023-8-28 23:12:45 | 显示全部楼层 |阅读模式   天津市天津市
30精币
用 bitBlt 函数获取透明分层窗口的图像怎么写?
网上cha询到了用这个函数可以做到获取透明分层窗口的位图或图片,但是不会写。
不是用《获取整个屏幕的图像,然后再截取图片》的方法。
求:易语言代码方式,写出的代码。
下面是cha询到的网页中的代码:

写一个简单抓屏函数的来测试下,以下采用Win32 API方式编写: HBITMAP Cap Screen() {       HDC hDisp DC,hMem DC;      // 获取屏幕DC       hDisp DC = Create DC("DISPLAY",NULL,NULL,NULL);       hMem DC = Create Compatible DC(hDisp DC);      int cx,cy;       cx = Get System Metrics(SM CXSCREEN);       cy = Get System Metrics(SM CYSCREEN);       HBITMAP hSnap Bt,hOld Bt;       hSnap Bt = Create Compatible Bitmap(hDisp DC,cx,cy);       hOld Bt = (HBITMAP)Select Object(hMem DC,hSnap Bt);       Bit Blt(hMem DC,0,0,cx,cy,hDisp DC,0,0,SRCCOPY);      // cleanup       Select Object(hMem DC,hOld Bt);       Delete DC(hMem DC);       Delete DC(hDisp DC);      return hSnap Bt; } 测试发现果然无法截取到使用Window Blinds模拟vista半透明主题的窗口栏,还有所有半透明的窗口!   利用Spy++对以上无法截取到的窗口进行抓捕,发现这些窗口都具有WS EX LAYERED这个扩展属性,又仔细看了下MSDN中关于Bit Blt的说明,原型如下: BOOL Bit Blt(    HDC hdc Dest, // handle to destination DC   int nXDest,  // x-coord of destination upper-left corner   int nYDest,  // y-coord of destination upper-left corner   int nWidth,  // width of destination rectangle   int nHeight, // height of destination rectangle    HDC hdc Src,  // handle to source DC   int nXSrc,   // x-coordinate of source upper-left corner   int nYSrc,   // y-coordinate of source upper-left corner    DWORD dw Rop  // raster operation code ); 对于其他参数我们并不用关心,主要该注意下最后这个参数dw Rop: [in] Specifies a raster-operation code. These codes define how the color data for the source rectangle is to be combined with the color data for the destination rectangle to achieve the final color. The following list shows some common raster operation codes. 反复看过几次所有参数的含义后发现对于参数CAPTUREBLT,有如下描述: Windows 98, Windows 2000: Includes any windows that are layered on top of your window in the resulting image. By default, the image only contains your window. 猜想大概就是这个了,不过在引用这个参数时貌似要先更新vc6的SDK,否则会提示CAPTUREBLT未定义,不过也可以手工来给它作个宏定义: #ifndef CAPTUREBLT #define CAPTUREBLT 0x40000000 #endif 然后试着再调用Bit Blt时组合上这个参数,结果果然可以截获半透明窗口了!   上述截屏函数也可以用MFC方式来写: HBITMAP Cap Screen() {       CDC disp DC,mem DC;       disp DC.Create DC("DISPLAY",NULL,NULL,NULL);       mem DC.Create Compatible DC(&disp DC);            int cx,cy;       cx = Get System Metrics(SM CXSCREEN);       cy = Get System Metrics(SM CYSCREEN);             CBitmap snap Bt,*pOld Bt;       snap Bt.Create Compatible Bitmap(&disp DC,cx,cy);             pOld Bt = mem DC.Select Object(&snap Bt);      // Bit Blt使用CAPTUREBLT参数       mem DC.Bit Blt(0,0,cx,cy,&disp DC,0,0,SRCCOPY | CAPTUREBLT);            // cleanup       mem DC.Select Object(pOld Bt);      // 不能返回snap Bt.m h Object或snap Bt.Get Safe Handle()      // 因为CBitmap对象在析构时会调用Delete Object来释放位图句柄      return (HBITMAP)snap Bt.Detach(); }




求:易语言代码方式,写出的代码。
谢谢!!

结帖率:60% (3/5)

签到天数: 25 天

发表于 2023-8-29 01:49:18 | 显示全部楼层   广西壮族自治区柳州市
QQ截图20230829014712.png

DLL

QQ截图20230829014811.png
回复

使用道具 举报

结帖率:57% (4/7)
 楼主| 发表于 2023-8-29 09:11:32 | 显示全部楼层   天津市天津市

非常感谢您的回答
但是这样我试过了
还是取不出来
你试试取《彗星小助手》的窗口
取不出它的窗口位图
回复

使用道具 举报

结帖率:60% (3/5)

签到天数: 25 天

发表于 2023-8-29 11:21:38 高大上手机用户 | 显示全部楼层   广西壮族自治区柳州市
a90789 发表于 2023-8-29 09:11
非常感谢您的回答
但是这样我试过了
还是取不出来

只是照源码还原srccopy+captureblt的组合=0x40cc0020
,致于这个组合有没有效,我也不知道,我没有慧星小助手
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表