64,649
社区成员
发帖
与我相关
我的任务
分享
void CaptureDeskToFile(char *szDeskFile)
{
// 设置windows station 和 desktop
HDESK hdesk;
HWINSTA hwinsta;
HDESK hdeskCurrent;
HWINSTA hwinstaCurrent;
hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL)
{
TRACE("get window station err");
return;
}
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL)
{
TRACE(_T("get window desktop err"));
return;
}
//打开winsta0
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL)
{
TRACE(_T("open window station err"));
return;
}
if (!SetProcessWindowStation(hwinsta))
{
TRACE(_T("Set window station err"));
return;
}
//打开desktop
hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL)
{
TRACE(_T("Open desktop err"));
return;
}
SetThreadDesktop(hdesk);
HWND hWnd = NULL;
HDC hScreenDC = NULL;
HDC MemDC = NULL;
hWnd = ::GetDesktopWindow(); // 获得屏幕的HWND.
hScreenDC = ::GetDC(hWnd); // 获得屏幕的HDC.
MemDC = ::CreateCompatibleDC(hScreenDC);
if (hWnd == NULL)
{
TRACE("hWnd:error=%d",GetLastError());
}
if (hScreenDC == NULL)
{
TRACE("hScreenDC:error=%d",GetLastError());
}
if (MemDC == NULL)
{
TRACE("MemDC:error=%d",GetLastError());
}
RECT rect;
if (::GetWindowRect(hWnd,&rect) == FALSE)
{
TRACE("GetWindowRect:error=%d",GetLastError());
}
SIZE screensize;
screensize.cx=rect.right-rect.left;
screensize.cy=rect.bottom-rect.top;
HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC,screensize.cx,screensize.cy);
HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
if (hBitmap == NULL)
{
TRACE("hBitmap:error=%d",GetLastError());
}
if (hOldBMP == NULL)
{
TRACE("hOldBMP:error=%d",GetLastError());
}
SetLastError(0);
if (::BitBlt(MemDC,0,0,screensize.cx,screensize.cy,hScreenDC,rect.left,rect.top,SRCCOPY) == 0)
{
TRACE("BitBlt:error=%d",GetLastError());
}
::SelectObject(MemDC,hOldBMP);
::DeleteObject(MemDC);
::ReleaseDC(hWnd,hScreenDC);
//将bmp保存到文件
//WriteBmpToFile(hBitmap,szPathOfDesktop);
if (!SetProcessWindowStation(hwinstaCurrent))
return;
if (!SetThreadDesktop(hdeskCurrent))
return;
if (!CloseWindowStation(hwinsta))
return ;
if (!CloseDesktop(hdesk))
return ;
}