首页
社区
课程
招聘
[求助]Win7 64位如何给屏幕拍快照
发表于: 2013-8-6 18:32 13581

[求助]Win7 64位如何给屏幕拍快照

2013-8-6 18:32
13581
收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 66
活跃值: (203)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
捕捉屏幕,貌似这个 api 和架构无关吧
**********
看了楼下,问题都没写清楚,你在 ring0,要么和 ring3通信,要么自己读显存,剩下的都比这麻烦
2013-8-6 19:45
0
雪    币: 807
活跃值: (2298)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
按下键盘上的<PrintScreen>键,屏幕图像就会存到剪贴板上,打开操作系统自带的图画工具,把剪贴板上的图像粘贴出来,保存成图片文件就可以了。
2013-8-7 00:51
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
亲。。我说的编程呢,,如果用以前XP用的API,获取出来的是黑屏。
2013-8-7 08:31
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
我说编程呢,亲。这不是很麻烦呀。
2013-8-7 08:32
0
雪    币: 342
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
GDI的方法创建一个DC,把DC的数据保存成BMP就行了,WIN7上没问题,常规解决方法
2013-8-7 08:50
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
7
楼上正解
2013-8-7 08:52
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
大牛,你说的方法是可以,用GDI的方法,因为我的源码是写在DLL中的,做成服务,让系统运行的。。。win7 64位好像不行。xp可以,,  win7 64直接用加载器加载DLl是可以的,但是服务就不行了。不知道哪的问题,
2013-8-7 10:56
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
求关注最新进展。
2013-8-7 10:59
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你这是在干坏事啊。 把服务相关的这一小段代码发出来。 调试看看。
2013-8-7 11:14
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
11
void PScreen(IStream *fStream, UINT quality)  
{  
    HDC hDCSrc = ::GetDC(NULL);  
    int nBitPerPixel = GetDeviceCaps(hDCSrc, BITSPIXEL);  
    int nWidth = GetDeviceCaps(hDCSrc, HORZRES);  
    int nHeight = GetDeviceCaps(hDCSrc, VERTRES);  
    CImage cImage;//使用CImage能省好多截图的代码  
    cImage.Create(nWidth, nHeight, nBitPerPixel);  
    BitBlt(cImage.GetDC(), 0, 0, nWidth, nHeight, hDCSrc, 0, 0, SRCCOPY);  
    ReleaseDC(NULL, hDCSrc);  
    cImage.ReleaseDC();//截图的代码到这里就结束了  
      
    COleStreamFile cImgStream;  
    cImgStream.CreateMemoryStream(NULL);  
    cImage.Save(cImgStream.GetStream(), Gdiplus::ImageFormatBMP);//将2进制数据写入流  
    Image image(cImgStream.GetStream());//从流创建Graphics::Image对象  
    cImgStream.Close();  
  
    CLSID encoderClsid;  
    GetEncoderClsid(L"image/jpeg", &encoderClsid);//获取编码CLSID  
    EncoderParameters encoderParameters;//下面这几样编码的参数我只知道一个.Value为压缩率,其他的不懂。  
    encoderParameters.Count = 1;   
    encoderParameters.Parameter[0].Guid = EncoderQuality;   
    encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;   
    encoderParameters.Parameter[0].NumberOfValues = 1;   
    encoderParameters.Parameter[0].Value = &quality;  
  
      
    image.Save(fStream, &encoderClsid, &encoderParameters);//写入流  
  
    image.Save(L"C:\\图片.jpg", &encoderClsid, &encoderParameters); //也可直接写入图片文件  
}  
2013-8-7 11:16
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
另外,你可以模拟键盘,发送printScreen 的键盘消息。。。 然后去把剪切板中的数据copy出来。
2013-8-7 11:18
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
这种方法不行,用户也有可能复制东西,,
2013-8-7 13:15
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
亲。。win7 64位,,你确定你的代码可以么。
2013-8-7 13:16
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
15
大牛,忘了跟你说,我的代码是运行在服务里面的,session 0的,刚才在网上查了一下,桌面是运行在session1,这两个无法交互的。
2013-8-7 13:19
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
建议你翻翻gh0st 看看别人怎么做的。

void CScreenSpy::ScanScreen( HDC hdcDest, HDC hdcSrc, int nWidth, int nHeight)
{
        UINT        nJumpLine = 50;
        UINT        nJumpSleep = nJumpLine / 10; // 扫描间隔
        // 扫描屏幕
        for (int i = 0, nToJump = 0; i < nHeight; i += nToJump)
        {
                int        nOther = nHeight - i;
               
                if (nOther > nJumpLine)
                        nToJump = nJumpLine;
                else
                        nToJump = nOther;
                BitBlt(hdcDest, 0, i, nWidth, nToJump, hdcSrc,        0, i, m_dwBitBltRop);
                Sleep(nJumpSleep);
        }
}
2013-8-7 14:07
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
设置允许服务与桌面交互
2013-8-7 15:29
0
雪    币: 778
活跃值: (208)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
18
在服务里面设置session
dwSessionId = WTSGetActiveConsoleSessionId();
SetTokenInformation(hToken, TokenSessionId, &dwSessionId, sizeof(DWORD));
2013-8-7 19:11
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
19
我已经试过gh0st了。很多个版本不可以,,有的版本可以,可以的版本我还没有拿到源码,如果用hdc的,那肯定是不可以的,gh0st都在service中运行。是获取不到桌面hdc的。
2013-8-8 13:33
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
20
亲。我设置了也没用。
2013-8-8 13:56
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
21
1、hToken是从哪个函数得到的呀。大牛。求详解。。。
2、在服务里设置是说在服务的源码里面设置么。还是?
2013-8-8 14:09
0
游客
登录 | 注册 方可回帖
返回
//