屏幕复制-(这个窗口是最小化的)

kenshu 2008-12-06 11:10:49
需要截屏的程序是别人的,用于监测数据,一定条件下会显示不同的图片和文字.

我定时(每分钟两次)需要截到这个窗口的屏幕,识别图像,如果发现显示了红灯,就把文字发给另一部机(我工作用的电脑).全部都做好了.

现在的问题是,截屏的这个函数,我必须把这个窗口调到最前面,可是我这部机并不专门跑这个程序,如果按这个函数,每30秒把这个窗口放到前面来,会干扰一些其它的操作.

有没有办法在这个窗口最小化时,也复制它的样子出来.

谢谢!

------------------------------------------------------
HWND hWndPrev= ::FindWindow(NULL,"系统数据监测");

if (hWndPrev){
//把它调到最前
::ShowWindow(hWndPrev,SW_SHOW);
::SetForegroundWindow(hWndPrev);
Sleep(1000);

if (IsWindow(hWndPrev)){
RECT lc;
::GetWindowRect(hWndPrev, &lc);
if (lc.top>=0 || lc.bottom>=0 && lc.left>=0 || lc.right>=0){

char * lc_body;
CDC *pDC;//屏幕DC
pDC = CDC::FromHandle(::GetDC(hWndPrev));//获取当前整个屏幕DC
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式

tagBITMAPINFO ls_info;
tagBITMAPFILEHEADER ls_header;
HDC lul_whdc = ::GetDC(::GetDesktopWindow());
if (lul_whdc==NULL){
return;
}

HDC hbuffer = ::CreateCompatibleDC(lul_whdc);
if (hbuffer == NULL){
::ReleaseDC(0,lul_whdc);
return;
}


HBITMAP hbmp = ::CreateCompatibleBitmap(lul_whdc, lc.right - lc.left , lc.bottom - lc.top ) ;
if (hbmp == NULL){
::ReleaseDC(0,lul_whdc);
::DeleteDC(hbuffer);
return;
}



if (::SelectObject(hbuffer,hbmp) == NULL){
::ReleaseDC(0,lul_whdc);
::DeleteDC(hbuffer);
::DeleteObject(hbmp);
return;
}


if (::BitBlt(hbuffer,0, 0, lc.right, lc.bottom, lul_whdc,lc.left,lc.top , SRCCOPY) == NULL){
::ReleaseDC(0,lul_whdc);
::DeleteDC(hbuffer);
::DeleteObject(hbmp);
return;
}
::ReleaseDC(0,lul_whdc);

ls_info.bmiHeader.biSize = 40;
ls_info.bmiHeader.biWidth = lc.right - lc.left;
ls_info.bmiHeader.biHeight = lc.bottom - lc.top;
ls_info.bmiHeader.biPlanes = 1;
ls_info.bmiHeader.biBitCount = BitPerPixel;
ls_info.bmiHeader.biCompression = 0;
ls_info.bmiHeader.biSizeImage = 0;
ls_info.bmiHeader.biXPelsPerMeter = 0;
ls_info.bmiHeader.biYPelsPerMeter = 0;
ls_info.bmiHeader.biClrUsed = 0;
ls_info.bmiHeader.biClrImportant = 0;

ls_header.bfSize = 14;
ls_header.bfOffBits = 14 + 40;
ls_header.bfType = 19778;
ls_header.bfReserved1 = 0;
ls_header.bfReserved2 = 0;


long ll_len = sizeof(ls_info.bmiHeader)+
sizeof(ls_header)+
(lc.right - lc.left + 1) * (lc.bottom - lc.top + 1) * (BitPerPixel) / 8 ;
lc_body = new char[ll_len];

::RtlMoveMemory(lc_body,&ls_header,sizeof(ls_header));
::RtlMoveMemory(lc_body + sizeof(ls_header),&ls_info.bmiHeader,sizeof(ls_info.bmiHeader));
::GetDIBits(hbuffer,hbmp,0,lc.bottom - lc.top,lc_body + sizeof(ls_header) + sizeof(ls_info.bmiHeader),&ls_info, 0);
::DeleteDC(hbuffer);

::DeleteObject(hbmp);
::DeleteDC(hbuffer);

//输出
CString ls_file_name;
ls_file_name = "f:\\desktop\\系统数据监测\\B"+shuf::DatetimeToString(shuf::Now(),"YYYYMMDDHHMMSS")+".bmp";
shuf::write_file(ls_file_name,lc_body,ll_len);

delete []lc_body;
return;
}
}
}
...全文
78 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenshu 2008-12-06
  • 打赏
  • 举报
回复
结贴,已经和一楼谈好。谢谢楼上另外两位.
kenshu 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 scq2099yt 的回复:]
快速显示窗口截屏,然后快速隐藏,给人感觉就是闪了一下
[/Quote]

我在最上面用了 Sleep(1000); 实际上有时不止,如果CPU/内存高负荷的情况下.

再,"然后快速隐藏",这个时候用户如果正在操作别的程序,有机会误操作。
scq2099yt 2008-12-06
  • 打赏
  • 举报
回复
快速显示窗口截屏,然后快速隐藏,给人感觉就是闪了一下
kenshu 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aj3423 的回复:]
需求囧了些。
可以切换用户或者用虚拟机么。
[/Quote]
我最坏的打算是,双显示器,一个专门显示那个程序。是不是更囧?
kenshu 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhoujianhei 的回复:]
像目标窗口发送WM_PRINT消息试试,需要事先准备好DC.
[/Quote]
高手,能不能详细一占。因为我VC用到的都是抱佛脚,现学现用的.以前没用过的就不会.
烦收一下站内短信.

谢谢!
kenshu 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aj3423 的回复:]
需求囧了些。
可以切换用户或者用虚拟机么。
[/Quote]

WIN2000 SERVER,不能切换用户。原来上面有几个程序在跑。
那个程序认硬件,而且虚拟机不给买LICENCE(要不然我可以随便复制,程序作者亏死),虽然我也不会随便复制,但他的原则我认同.

谢谢!
aj3423 2008-12-06
  • 打赏
  • 举报
回复
需求囧了些。
可以切换用户或者用虚拟机么。
zhoujianhei 2008-12-06
  • 打赏
  • 举报
回复
像目标窗口发送WM_PRINT消息试试,需要事先准备好DC.

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧