因为Windows很笨的,它只会这样做。
先激活要截取的窗口再截取。
先激活要截取的窗口再截取。
解决方案 »
- 一个漂亮的工控类控件合集包,UI也很好看哦
- VC2010 RELEASE 链接错误
- MFC中的SelectObject问题
- 请教能者:关于RTSP协议的问题,无法收到全部视频
- 如何从内存中读写XML?比如将一个CString作为XML
- 编译错误,
- 将下面这段VB代码用VC写出来,图形方面高手来看(100分)
- 请问:unsigned long ip2=*(unsigned long*)("202.108.35.218") 然后ip2=775041074,怎么算的?
- 谁能告诉我有关文件格式的一些网站!!中英文均可!!谢谢
- 各位专家、高手请进
- 一个很简单的问题,但相信不同的人有不同的答案,你呢?我是......
- 急,非常紧急,各位同仁们,清帮忙
试试SetForegroundWindow或SetActiveWindow。
如果你是想保存自己写的程序的窗口内容,最简单的方法就是自己创建一个内存DC和位图,如果你是用MFC,直接调用CXXXView::OnDraw即可,如果不是你也应该有自己的重画函数,将你创建的DC传进去即可.
HDC g_hMemDC = NULL;
HBITMAP g_hBitmap = NULL;
BOOL g_bPtInit = FALSE;
...
case WM_PAINT:
{
PAINTSTRUCT PtData;
HDC hdc = BeginPaint(hWnd, &PtData);
RECT rect;
GetClientRect(hWnd, &rect);
//完成一些初始化工作。
if(!g_bPtInit) {
g_hMemDC = CreateCompatibleDC(hdc);
g_hBitmap = CreateCompatibleBitmap(hdc,rect.right-rect.left+1,rect.bottom-rect.top+1);
SelectObject(g_hMemDC,g_hBitmap);
g_bPtInit = TRUE;
}
//把当前的位图保存在MemDC上,如果你不需要,也可以不用。
BitBlt(g_hMemDC,0,0,rect.right-rect.left+1,rect.bottom-rect.top+1,hdc,0,0,SRCCOPY);
//这里完成你的绘图工作,所有用hdc的地方都改用g_hMemDC。
...
//绘图工作完成后把位图贴回到hdc上
BitBlt(hdc,0,0,rect.right-rect.left+1,rect.bottom-rect.top+1,g_hMemDC,0,0,SRCCOPY);
EndPaint(hWnd, &PtData);
}
break;
//注意删除创建的GDI对象。
case WM_DESTROY:
{
if(g_bPtInit) {
DeleteDC(g_hMemDC);
DeleteObject(g_hBitmap);
g_bPtInit = FALSE;
}
}
break;
以上代码没具体测试过,希望对你有用。
case WM_NCPAINT
{
//调用DefWindowProc绘制边框和标题栏
DefWindowProc(hWnd,uMessage,wParam,lParam);
//如果没有初始化,则完成初始化工作,我忘了WM_PAINT和WM_NCPAINT哪个会先调用了。为了安全...
if(!g_bPtInit) {
g_hMemDC = CreateCompatibleDC(hdc);
g_hBitmap = CreateCompatibleBitmap(hdc,rect.right-rect.left+1,rect.bottom-rect.top+1);
SelectObject(g_hMemDC,g_hBitmap);
g_bPtInit = TRUE;
}
//把整个窗口的位图缓冲到g_hMemDC里
RECT rect;
HDC hdc = GetWindowDC(hWnd);
GetWindowRect(&rect);
BitBlt(g_hMemDC,0,0,rect.right-rect.left+1,rect.bottom-rect.top+1,hdc,0,0,SRCCOPY);
}
break;
注意相应修改一下WM_PAINT的处理。现在MemDC保存的是整个窗口的内容而不是以前客户区的内容,所以BitBlt时的坐标应该有所变化。