首页
社区
课程
招聘
[求助] 收藏 PrintWindow 截图为什么黑屏呢,vc++,VB却可以。。谢谢
发表于: 2013-3-4 23:23 21244

[求助] 收藏 PrintWindow 截图为什么黑屏呢,vc++,VB却可以。。谢谢

2013-3-4 23:23
21244
vb的代码可以,vc的不可以。
请看VB代码,
picture1是个图片控件,这样一截图,就ok了。

Picture1.Cls
  Call PrintWindow(Val(TxtHwnd.Text), Picture1.hdc, 0)  
Picture1.Refresh

===========================
vc的是这样的


typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags);
	//RECT rect;
	HMODULE h;
	h = LoadLibrary( L"user32.dll" );
	pPrintWindow p;
	if( h )
	{
		p = ( pPrintWindow )::GetProcAddress( h, "PrintWindow" );
	}
        
        p(hWnd,*bitcdc,0);




//bitcdc 是个图片控件的CDC   CDC *bitcdc  m_pic.GetDC()

为什么VB这样可以,VC截出来的却是黑屏呢,
vc的可以看到标题栏。十几次可以正确一次。其余的都是黑屏

求高手解答啊。指点迷津

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

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
哎,还是没搞出来.......
2013-3-5 09:00
0
雪    币: 18
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
以前写过这方面代码,实现截屏。
BOOL _ScreenCapture(HBITMAP &_hBitmap,LPCSTR lpFileName)
{
        HDC hDC = GetDC(GetDesktopWindow());
        if (hDC == NULL){
                return FALSE;
        }
        int BitPerPixel = GetDeviceCaps(hDC,BITSPIXEL);
        int Width = GetDeviceCaps(hDC,HORZRES);
        int Height = GetDeviceCaps(hDC,VERTRES);

        HDC memDC = CreateCompatibleDC(hDC);
        if (memDC == NULL){
                return FALSE;
        }
        HBITMAP hBitmap = CreateCompatibleBitmap(hDC, Width, Height);
        if (hBitmap == NULL){
                DeleteDC(memDC);
                return FALSE;
        }
       
        HBITMAP hOldBitmap = (HBITMAP)SelectObject(memDC,(HGDIOBJ)hBitmap);
       
        if(hOldBitmap == NULL){
                DeleteDC(memDC);
                return FALSE;
        }
       
        if(BitBlt(memDC,0, 0, Width, Height, hDC, 0, 0, SRCCOPY) == 0){
                DeleteDC(memDC);
                return FALSE;
        }
       
        BITMAP bmp;
        GetObject(hBitmap, sizeof(BITMAP), &bmp);

        BITMAPINFOHEADER bih = {0};
        bih.biBitCount = bmp.bmBitsPixel;
        bih.biCompression = BI_RGB;
        bih.biHeight = bmp.bmHeight;
        bih.biPlanes = 1;
        bih.biSize = sizeof(BITMAPINFOHEADER);
        bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;
        bih.biWidth = bmp.bmWidth;

        BITMAPFILEHEADER bfh = {0};
        bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
        bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;
        bfh.bfType = (WORD)0x4D42;

        UINT uHeadSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
        UINT uSize = bmp.bmWidthBytes * bmp.bmHeight + uHeadSize;
        char *pBuf = new char[uSize];
        if (pBuf == NULL){
                DeleteObject((HGDIOBJ)hBitmap);
                DeleteDC(memDC);
                return FALSE;
        }
        char *pTmp = pBuf;
        memcpy(pTmp, &bfh, sizeof(BITMAPFILEHEADER));
        pTmp += sizeof(BITMAPFILEHEADER);
        memcpy(pTmp, &bih, sizeof(BITMAPINFOHEADER));
        pTmp += sizeof(BITMAPINFOHEADER);

        GetDIBits(memDC,hBitmap,0,Height,pTmp,(LPBITMAPINFO) &bih,DIB_RGB_COLORS);
        if (lpFileName != NULL){
                HANDLE  hFile = CreateFileA( lpFileName,
                        GENERIC_WRITE,
                        FILE_SHARE_READ,
                        NULL,
                        CREATE_ALWAYS,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
                if ( hFile == INVALID_HANDLE_VALUE ){
                        DeleteDC(memDC);
                        delete pBuf;
                        return FALSE;
                }
                DWORD dwWrite = 0;
                if(!WriteFile(hFile,pBuf,uSize,&dwWrite,NULL)){
                        DeleteDC(memDC);
                        delete pBuf;
                        return FALSE;
                }
                CloseHandle(hFile);
        }
       
        SelectObject(memDC,(HGDIOBJ)hOldBitmap);
        DeleteDC(memDC);
       
        _hBitmap = hBitmap;
        delete pBuf;
        return TRUE;
}
BOOL _ScreenCaptureBitmap(HBITMAP &_hBitmap,LPCSTR lpFileName)
{
        BOOL bFlag = FALSE;
        _hBitmap = NULL;
        HWINSTA hwinstaLsass = GetProcessWindowStation();   
        if(hwinstaLsass != NULL)   
        {
                HDESK hdeskLsass = GetThreadDesktop( GetCurrentThreadId() );   
                if(hdeskLsass != NULL)   
                {   
                        HWINSTA hwinstaUser =  OpenWindowStationA("WinSta0", FALSE, MAXIMUM_ALLOWED);   
                        if(hwinstaUser != NULL)   
                        {   
                                if(SetProcessWindowStation(hwinstaUser))   
                                {   
                                        HDESK   hdeskUser = OpenDesktopA("Default", 0, FALSE, MAXIMUM_ALLOWED);
                                        if(hdeskUser != NULL)
                                        {
                                                if(SetThreadDesktop(hdeskUser))
                                                {
                                                        bFlag = _ScreenCapture(_hBitmap,lpFileName);
                                                        SetThreadDesktop(hdeskLsass);   
                                                }     
                                                CloseDesktop(hdeskUser);   
                                        }
                                        SetProcessWindowStation(hwinstaLsass);   
                                }
                                CloseWindowStation(hwinstaUser);   
                        }   
                }   
        }
        return bFlag;
}

BOOL _FreeScreenBitmap(HBITMAP &_hBitmap)
{
        if (_hBitmap != NULL && _hBitmap != (HBITMAP)0xCCCCCCCC){
                DeleteObject((HGDIOBJ)_hBitmap);
                _hBitmap = NULL;
                return TRUE;
        }
        return FALSE;
}
2013-3-5 09:19
0
雪    币: 18
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
对了,之前还写过可以截屏 已经最小化的窗口。晚上回去给你找找。
2013-3-5 09:19
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主貌似要的是窗口截图,楼上给的是桌面的吧
2013-3-5 11:34
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
m_pic.GetDC() 换成 m_pic.GetWindowDC() 试试
2013-3-5 12:13
0
雪    币: 304
活跃值: (507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
最小化的无法截图,但是被挡住的是可以的。。
2013-3-5 17:47
0
雪    币: 69
活跃值: (41)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
2013-3-5 18:43
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
8楼也是给的整个屏幕的方式,我和楼主想知道的是窗口的扑捉,printwindow不是不可以,要N次才能出一张,但是VB的基本一截就中,有没有了解这方面的呢
2013-3-5 19:48
0
雪    币: 69
活跃值: (41)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
基于窗口的,试试开源的taksi:http://taksi.sourceforge.net/(需要翻墙,maybe...)
2013-3-5 23:27
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
LeoSky,可以邮我一份参考一下么?我的邮箱是:szu_andy@126.com
2013-5-16 01:50
0
雪    币: 18
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
已经发送。请查收。
2013-5-16 16:47
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
LeoSky,谢谢大神,不习惯看论坛内的短信息,现在才看到,真对不起大神啊
2013-12-16 21:58
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
LeoSky,能不能也发我一份啊,我最近也在这方面资料:xilige9527@gmail.com
2014-1-4 23:50
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
请求帮助,遇到同样的问题。。最小化的窗口,怎么截图?
2014-4-5 10:21
0
雪    币: 199
活跃值: (102)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
刚好碰到这个问题,我用网上的PrintWindow的例子,截到的是黑屏
恳请大神指点,21cnchong@21cn.com
2014-7-11 03:14
0
雪    币: 98
活跃值: (79)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
http://www.codeproject.com/Articles/20651/Capturing-Minimized-Window-A-Kid-s-Trick/
2014-7-11 11:26
0
雪    币: 199
活跃值: (102)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我下载了他的demo,测试其他窗口时可以截到的,但我想要的窗口他也是截到黑屏啊!!
2014-7-11 16:04
0
游客
登录 | 注册 方可回帖
返回
//