C语言关于Windows服务项的项目,要进行屏幕全部的截图,
服务对窗口类直接进行操作会出现问题,
MSDN上说是没有取得Station和Desktop的权限,于是我就像模像样的弄了一下这两个函数
BitBlt函数不报错了,但是保存的ScreenShot.bmp全是黑色分辨率统一为1024x768,
直接在普通项目中是没有任何问题的.
截图是通过取得全屏幕DC然后创建兼容位图,再把取得的位图放进兼容位图,GlobalAlloc开辟内存,GetDIBits到缓冲区,然后写入到bmp文件.
关于取得Station和Desktop的权限这部分:
static void setServerToWindow(){
char ExePath[MAX_PATH];
memset(ExePath, 0, sizeof(ExePath));
DWORD dwLen = ::GetModuleFileNameA(NULL, ExePath, sizeof(ExePath));
if (dwLen >= 0) {
PathRemoveFileSpecA(ExePath);
}
//
char fullPath[MAX_PATH];
sprintf(fullPath, "%s\\checkV5Bill.exe", ExePath);
DWORD sleepTime = 1000 * 2 * 60;
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL) {
return;
}
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL) {
return;
}
//打开用户的winsta0
hwinsta = OpenWindowStationA("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL) {
return;
}
if (!SetProcessWindowStation(hwinsta)) {
return;
}
//打开desktop
hdesk = OpenDesktopA("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL) {
return;
}
SetThreadDesktop(hdesk);
}