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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
harrystar
Сообщения: 2
Зарегистрирован: 23 мар 2005, 11:37

Всем добрый день.
Есть у меня проблемка. Пишу вот сервис некий, часть которого работает наподобии 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);

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

Есть какой-то другой способ?
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Вот пример из 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; 
} 

2B OR NOT(2B) = FF
harrystar
Сообщения: 2
Зарегистрирован: 23 мар 2005, 11:37

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