C语言 服务项进行全屏幕截图 但是截图后是黑屏怎么办?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 服务项进行全屏幕截图 但是截图后是黑屏怎么办?相关的知识,希望对你有一定的参考价值。
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);
感觉你需要获得当且登录用户而不是服务的station和desktop,但是我确实不会本回答被提问者和网友采纳
C语言怎么实现截图
能实现么 求具体思路
1、用C语言实现windows程序截图,太麻烦。建议用C++做比较好。
2、截图例程:
#define CAPTUREBLT 0x40000000
#endif
HBITMAP CaptureScreen(LPRECT lpRect)//lpRect为NULL时表示全屏幕截图
HDC hdc, hdcMem ;
HBITMAP hemfCopy ;
HWND hwndScr ;
int dstcx, dstcy ;
if(lpRect)
dstcx = lpRect->right - lpRect->left ;
dstcy = lpRect->bottom - lpRect->top ;
else
dstcx = GetSystemMetrics(SM_CXSCREEN) ;
dstcy = GetSystemMetrics(SM_CYSCREEN) ;
if (LockWindowUpdate(hwndScr = GetDesktopWindow ()))
hdc = GetDCEx (hwndScr, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE) ;
hdcMem = CreateCompatibleDC (hdc) ;
if(NULL==hdcMem)
ReleaseDC (hwndScr, hdc) ;
LockWindowUpdate (NULL) ;
return NULL;
hemfCopy = CreateCompatibleBitmap (hdc, abs(dstcx), abs(dstcy)) ;
if(NULL==hemfCopy)
DeleteDC (hdcMem) ;
ReleaseDC (hwndScr, hdc) ;
LockWindowUpdate (NULL) ;
return NULL;
SelectObject (hdcMem, hemfCopy) ;
if(lpRect)
StretchBlt (hdcMem, 0, 0, abs(dstcx), abs(dstcy),
hdc, lpRect->left, lpRect->top, dstcx, dstcy, SRCCOPY|CAPTUREBLT) ;
else
BitBlt (hdcMem, 0, 0, dstcx, dstcy,
hdc, 0, 0, SRCCOPY|CAPTUREBLT) ;
DeleteDC (hdcMem) ;
ReleaseDC (hwndScr, hdc) ;
LockWindowUpdate (NULL) ;
return hemfCopy;
return NULL;
参考技术A
// MSDN 一下,GDI接口,GetSystemMetrics
#ifndef CAPTUREBLT
#define CAPTUREBLT 0x40000000
#endif
HBITMAP CaptureScreen(LPRECT lpRect)//lpRect为NULL时表示全屏幕截图
HDC hdc, hdcMem ;
HBITMAP hemfCopy ;
HWND hwndScr ;
int dstcx, dstcy ;
if(lpRect)
dstcx = lpRect->right - lpRect->left ;
dstcy = lpRect->bottom - lpRect->top ;
else
dstcx = GetSystemMetrics(SM_CXSCREEN) ;
dstcy = GetSystemMetrics(SM_CYSCREEN) ;
if (LockWindowUpdate(hwndScr = GetDesktopWindow ()))
hdc = GetDCEx (hwndScr, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE) ;
hdcMem = CreateCompatibleDC (hdc) ;
if(NULL==hdcMem)
ReleaseDC (hwndScr, hdc) ;
LockWindowUpdate (NULL) ;
return NULL;
hemfCopy = CreateCompatibleBitmap (hdc, abs(dstcx), abs(dstcy)) ;
if(NULL==hemfCopy)
DeleteDC (hdcMem) ;
ReleaseDC (hwndScr, hdc) ;
LockWindowUpdate (NULL) ;
return NULL;
SelectObject (hdcMem, hemfCopy) ;
if(lpRect)
StretchBlt (hdcMem, 0, 0, abs(dstcx), abs(dstcy),
hdc, lpRect->left, lpRect->top, dstcx, dstcy, SRCCOPY|CAPTUREBLT) ;
else
BitBlt (hdcMem, 0, 0, dstcx, dstcy,
hdc, 0, 0, SRCCOPY|CAPTUREBLT) ;
DeleteDC (hdcMem) ;
ReleaseDC (hwndScr, hdc) ;
LockWindowUpdate (NULL) ;
return hemfCopy;
return NULL;
本回答被提问者和网友采纳以上是关于C语言 服务项进行全屏幕截图 但是截图后是黑屏怎么办?的主要内容,如果未能解决你的问题,请参考以下文章