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);

参考技术A 没搞过,只能猜测:“屏幕”资源是和具体用户打开的界面有关的,所以MSDN说你需要获得station和desktop。而GetProcessWindowStation和GetThreadDesktop(GetCurrentThreadId());获得的都是当且进程和线程的station和desktop,而你在服务中,它根本就没有station和desktop啊,你拿到的是啥?

感觉你需要获得当且登录用户而不是服务的station和desktop,但是我确实不会本回答被提问者和网友采纳

C语言怎么实现截图

能实现么 求具体思路

1、用C语言实现windows程序截图,太麻烦。建议用C++做比较好。
2、截图例程:

#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;

参考技术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语言 服务项进行全屏幕截图 但是截图后是黑屏怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我用vnc连接服务器是黑屏?

电脑截全屏怎么截?

电脑怎么全屏截图

macOS升级至10.15后VMware不可用

为啥windows 2012 r2x64系统安装桌面体验后,开机输入账户密码后是黑屏的,也没有任何命令行界面

kmp, 影音先锋 全屏黑屏,但有声音和字幕