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