首页
社区
课程
招聘
[求助]关于GDI后台找图的问题
发表于: 2013-8-20 01:02 10551

[求助]关于GDI后台找图的问题

2013-8-20 01:02
10551
今天有网友讨论插件问题,引出来这个问题。
于是研究了目前的几个主流的后台截图插件,发现速度都很快。

我自己尝试着考虑如下:(例如截取记事本被遮挡时的图)
hdc=GetWindowDC(记事本的HWND)
memDC=CreateCompitableDC(hdc)
hbitmap=CreateCompitableBitmap(hdc)
oldbitmap=selectObject(memDC,hbitmap)
bitblt(memDC,0,0,width,height,0,0,SRCCOPY)
将指向记事本的HWND的DC拷贝到内存DC中去,然后就操作这片内存DC。

但是我发现记事本被遮挡时(我的是WINXP系统),截取只是一部分。后来考虑使用PrintWindow这个函数, PrintWindow(hwnd, memdc, PW_CLIENTONLY); 这个函数就是一个重定向作用,将指向记事本的DC拷贝到memDC中去,这样获取的图像就是没有遮挡的后台截图类型。

但是问题来了,这个截取速度很慢。发现上面说的其他流行后台插件好像都没有用PrintWindow。不知道如何获取指向HWND的这片内存DC呢?

有无大侠指点一二???

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
参考代码如下:

#define _WIN32_WINNT 0x0501 //仅XP或以上系统有效
#include <windows.h>
int main()
{
   RECT rc;
   HWND hwnd = FindWindow(TEXT("Notepad"), NULL); //注意窗口不能最小化  
   if (hwnd == NULL)
   {
      cout << "找不到记事本窗口" << endl;
      return 0;
   }
   GetClientRect(hwnd, &rc);

  //创建
   HDC hdcScreen = GetDC(NULL);
   HDC hdc = CreateCompatibleDC(hdcScreen);
   HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);   
   SelectObject(hdc, hbmp);

   //复制
   PrintWindow(hwnd, hdc, PW_CLIENTONLY);
  //PW_CLIENTONLY:Only the client area of the window is copied to hdcBlt.
  //By default, the entire window is copied.   
  //PW_CLIENTONLY表示仅仅拷贝窗口的客户区域,而默认情况下,执行printwindow会拷贝整个窗口

  //复制到粘贴板  
   OpenClipboard(NULL);
   EmptyClipboard();
   SetClipboardData(CF_BITMAP, hbmp);
   CloseClipboard();

  //释放
   DeleteDC(hdc);
   DeleteObject(hbmp);
   ReleaseDC(NULL, hdcScreen);

   cout << "成功把记事本窗口复制到粘贴板,请粘贴到Windows画图工具" << endl;

   return 0;
}
2013-8-20 01:03
0
雪    币: 6
活跃值: (1282)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
以前下载的代码找不到了
2013-8-20 08:41
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
什么代码???????
2013-8-20 20:55
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
UP UP UP 求高人指点一下啊。。。
2013-8-20 22:15
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
没有高人指点一下么???谢谢了
2013-8-23 20:49
0
雪    币: 95
活跃值: (64)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
没研究过后台的,LZ可以去找找DirectX接口是否有类似的函数可以利用
2013-8-25 13:19
0
雪    币: 261
活跃值: (547)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
D3D HOOK....都是用这个了 GDI找图慢  很多游戏GDI无效了
2013-8-26 00:55
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
GDI 如何HOOK呢? 有知道的高收吗/?
2013-8-26 21:00
0
雪    币: 261
活跃值: (547)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
GDI不需要HOOK   PrintWindow
应该有大牛知道从显存里获取图像 速度是最快的  通杀一切内核保护
2013-8-27 20:01
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
PrintWindow好像不行,速度太慢,哪个大佬指点一下,如何从显存直接获取????HDC
2013-8-27 20:50
0
雪    币: 80
活跃值: (109)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
关注中。
2013-8-27 21:52
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
没有高手指点一下么,gdi的
2013-8-28 12:31
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
继续定啊。。。高手在哪里
2013-8-30 15:04
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
关键是地址和存储格式,以前DOS下直接操作显存轻而易举。现在貌似被屏蔽了。

不能直接访问。
2013-8-30 15:27
0
游客
登录 | 注册 方可回帖
返回
//