Страница 1 из 1

Screenshot из под сервиса

Добавлено: 23 мар 2005, 12:01
harrystar
Всем добрый день.
Есть у меня проблемка. Пишу вот сервис некий, часть которого работает наподобии RAdmina.
В частности надо снять скрин с экрана.
Пока моя прога в обычном режиме, все отлично снимается, пользуюсь я
HDC hDC=GetDC(NULL);
hDC_virt=CreateCompatibleDC(hDC);
HBITMAP hBmp=CreateCompatibleBitmap(hDC, 1024, 768);
SelectObject(hDC_virt, hBmp);
BitBlt(hDC_virt, 0,0,1024, 768, hDC, 0,0,SRCCOPY);

Все отлично работает. НО!!!
Как только я ставлю этот код в прогу, работающую как сервис - то этот код выдает пустой экран. Никаких ошибок или чего, просто, как будто экран весь черный.

Есть какой-то другой способ?

Добавлено: 23 мар 2005, 15:00
Absurd
Вот пример из MSDN. Он переключает текущий десктоп сервиса на тот, который виден пользователю, показывает пользователю диалог, а потом ставит все на место.

Код: Выделить всё

int 
UserMessageBox( 
    RPC_BINDING_HANDLE h, 
    LPSTR lpszWindowStation, 
    LPSTR lpszDesktop, 
    LPSTR lpszText, 
    LPSTR lpszTitle, 
    UINT fuStyle) 
{ 
    DWORD dwThreadId; 
    HWINSTA hwinstaSave; 
    HDESK hdeskSave; 
    HWINSTA hwinstaUser; 
    HDESK hdeskUser; 
    int result; 
 
    // Ensure connection to service window station and desktop, and 
    // save their handles. 

    GetDesktopWindow(); 
    hwinstaSave = GetProcessWindowStation(); 
    dwThreadId = GetCurrentThreadId(); 
    hdeskSave = GetThreadDesktop(dwThreadId); 
 
    // Impersonate the client and connect to the User's 
    // window station and desktop. 

    RpcImpersonateClient(h); 
    hwinstaUser = OpenWindowStation(lpszWindowStation, FALSE, MAXIMUM_ALLOWED); 
    if (hwinstaUser == NULL) 
    { 
        RpcRevertToSelf(); 
        return 0; 
    } 
    SetProcessWindowStation(hwinstaUser); 
    hdeskUser = OpenDesktop(lpszDesktop, 0, FALSE, MAXIMUM_ALLOWED); 
    RpcRevertToSelf(); 
    if (hdeskUser == NULL) 
    { 
        SetProcessWindowStation(hwinstaSave); 
        CloseWindowStation(hwinstaUser); 
        return 0; 
    } 
    SetThreadDesktop(hdeskUser); 
 
    // Display message box. 

    dwGuiThreadId = dwThreadId; 
    result = MessageBox(NULL, lpszText, lpszTitle, fuStyle); 
    dwGuiThreadId = 0; 
 
    // Restore window station and desktop. 

    SetThreadDesktop(hdeskSave); 
    SetProcessWindowStation(hwinstaSave); 
    CloseDesktop(hdeskUser); 
    CloseWindowStation(hwinstaUser); 
 
    return result; 
} 


Добавлено: 24 мар 2005, 00:18
harrystar
Спасибо. Попробую разобраться. А как мне при этом получить нужный hDC?
HWND hWin=GetDesktopWindow();
HDC hDC=GetDC(hWin);
Вот так я попробовал... тотже результат.