Всем добрый день.
Есть у меня проблемка. Пишу вот сервис некий, часть которого работает наподобии 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);
Все отлично работает. НО!!!
Как только я ставлю этот код в прогу, работающую как сервис - то этот код выдает пустой экран. Никаких ошибок или чего, просто, как будто экран весь черный.
Есть какой-то другой способ?
Screenshot из под сервиса
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 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
Спасибо. Попробую разобраться. А как мне при этом получить нужный hDC?
HWND hWin=GetDesktopWindow();
HDC hDC=GetDC(hWin);
Вот так я попробовал... тотже результат.
HWND hWin=GetDesktopWindow();
HDC hDC=GetDC(hWin);
Вот так я попробовал... тотже результат.