HWINSTA m_hwinsta=0;
HDESK m_hdesk=0; // 窗口句柄
BOOL setDesktop()
{
m_hwinsta =OpenWindowStation("winsta0",false,MAXIMUM_ALLOWED);
if (m_hwinsta == NULL)
return FALSE;
if (!SetProcessWindowStation(m_hwinsta))
return FALSE;
m_hdesk =OpenDesktop("default",0,FALSE,MAXIMUM_ALLOWED);
if (m_hdesk == NULL)
return false;
SetThreadDesktop(m_hdesk);
return true;
}我的程序在服务中间接启动执行的(ShellExecute()), 现要取当前桌面的画面总是不成,因为进
程属于SYSTEM. 用上面的代码方能取到当前登录的桌面,如何保存画面呢
HDESK m_hdesk=0; // 窗口句柄
BOOL setDesktop()
{
m_hwinsta =OpenWindowStation("winsta0",false,MAXIMUM_ALLOWED);
if (m_hwinsta == NULL)
return FALSE;
if (!SetProcessWindowStation(m_hwinsta))
return FALSE;
m_hdesk =OpenDesktop("default",0,FALSE,MAXIMUM_ALLOWED);
if (m_hdesk == NULL)
return false;
SetThreadDesktop(m_hdesk);
return true;
}我的程序在服务中间接启动执行的(ShellExecute()), 现要取当前桌面的画面总是不成,因为进
程属于SYSTEM. 用上面的代码方能取到当前登录的桌面,如何保存画面呢
http://download.csdn.net/source/2761985
这个贴子 是成功的希望!
这个贴子 是成功的希望!
{
INT FWidth;
INT FHeight;
HDC HdcDesktop;
HWND HwndDesktop;
HDC HdcMemory;
HBITMAP HBmpMemory;
PVOID PDatBitmap;
BITMAPINFO BmpInfo;
BITMAPFILEHEADER BmpHeader; FWidth=GetSystemMetrics(SM_CXSCREEN);
FHeight=GetSystemMetrics(SM_CYSCREEN); memset(&BmpInfo, 0, sizeof(BITMAPINFO));
BmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BmpInfo.bmiHeader.biHeight = FHeight;
BmpInfo.bmiHeader.biWidth = FWidth;
BmpInfo.bmiHeader.biPlanes = 1;
BmpInfo.bmiHeader.biBitCount = 16;
BmpInfo.bmiHeader.biCompression = BI_RGB;
BmpInfo.bmiHeader.biSizeImage = 2*FWidth*FHeight; memset(&BmpHeader, 0, sizeof(BITMAPFILEHEADER));
BmpHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
BmpHeader.bfSize = BmpInfo.bmiHeader.biSizeImage + BmpHeader.bfOffBits;
BmpHeader.bfType = 0x4d42; HwndDesktop = GetDesktopWindow();
HdcDesktop = GetDC(HwndDesktop);
HdcMemory = CreateCompatibleDC(HdcDesktop);
HBmpMemory = CreateDIBSection(HdcDesktop,&BmpInfo,DIB_RGB_COLORS,&PDatBitmap,NULL,0);
SelectObject(HdcMemory,HBmpMemory);
BitBlt(HdcMemory,0,0,FWidth,FHeight,HdcDesktop,0,0,SRCCOPY); TFileStream *mf=new TFileStream("d:\\test.bmp",fmCreate);
mf->Write(&BmpHeader,sizeof(BITMAPFILEHEADER));
mf->Write(&BmpInfo,sizeof(BITMAPINFOHEADER));
mf->Write(PDatBitmap,BmpInfo.bmiHeader.biSizeImage); delete mf;
DeleteObject(HBmpMemory);
DeleteDC(HdcMemory);
ReleaseDC(HwndDesktop,HdcDesktop);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Capture();
}
原贴截屏这段代码,怎么不对呢。存下的BMP文件看不到图像。
昨天试了一天,未成,今上午莫名其妙成了!也没改源程序,可能机器重启了,
可能与卸了一次服务有关。截屏一下成功了!我竟然不相信自已的眼睛了。
为了使后面的人不重复我的费事过程,把源码贴出,积德呀:)。
void setDesktop() // 切换到用户桌面
{
char pvInfo[128]= { 0 };
DWORD dwLen=0;
HDESK hActiveDesktop=OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK,false,MAXIMUM_ALLOWED);
GetUserObjectInformation(hActiveDesktop,UOI_NAME,pvInfo,sizeof(pvInfo),&dwLen);
CloseDesktop(hActiveDesktop);
HWINSTA m_hwinsta=OpenWindowStation("WINSTA0",false,MAXIMUM_ALLOWED);
SetProcessWindowStation(m_hwinsta);
HDESK m_hdesk=OpenDesktop(pvInfo,0,false,MAXIMUM_ALLOWED);
SetThreadDesktop(m_hdesk);
}
void SaveDesktop(TStream *fs,int q) // 保存桌面jpg到流中 图象质量q%
{
setDesktop(); // 切换到用户桌面
RECT r;
HWND d0=GetDesktopWindow();
GetWindowRect(d0,&r);
TCanvas *Canvas0=new TCanvas;
Canvas0->Handle=GetDC(d0); Graphics::TBitmap *b=new Graphics::TBitmap();
b->Height=r.bottom;
b->Width=r.right;
b->Canvas->CopyRect(r,Canvas0,r); TJPEGImage *j=new TJPEGImage();
j->CompressionQuality=q; // 图象质量 1-100%
j->Assign(b);
try
{
j->SaveToStream(fs);
}
catch(...)
{
}
delete j;
delete b;
delete Canvas0;
}
就这么一点点长,费了我一个星期,搜的许多旧贴子,许多人遇到同样的苦恼。