Изображение из другого рабочего стола (CreateDesktop)

Тема в разделе "WASM.WIN32", создана пользователем Snake_Solid, 30 дек 2008.

  1. Snake_Solid

    Snake_Solid New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2008
    Сообщения:
    1
    Проблема в следующем: в приложени создается новый рабочий стол (CreateDesktop) и новый поток. Поток выбирает себе вновь созданный рабочий стол в качастве текущего (SetThreadDesktop). Запускает в нем несколько процессов. Затем ожидает сигнала от пользователя. Закрывает процессы. И сам завершается.

    Вопрос в следующем пользователь должен видеть часть созданного рабочего стола, я получаю изображение через StretchBlt - если не создавать рабочий стол, а запускать все на текущем то все работает. На созданном рабочем столе StretchBlt возбращает ошибку. GetLastError говорит - "Отказано в доступе". Все действия выполняются под пользователем Администратор.

    Код примерно такой:
    Код (Text):
    1. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    2. {
    3.     instance = hInstance;
    4.  
    5.     HDESK  newdesk;
    6.     HANDLE deskthrd;
    7.     DWORD  thrdid;
    8.  
    9.     newdesk = CreateDesktop("temp", NULL, NULL, 0, GENERIC_ALL, NULL);
    10.  
    11.     if (newdesk == NULL)
    12.         return(-1);
    13.  
    14.     deskthrd = CreateThread(NULL, 512, DeskThreadProc, &newdesk, CREATE_SUSPENDED, &thrdid);
    15.  
    16.     if (deskthrd == NULL)
    17.         return(-2);
    18.  
    19.     SetThreadPriority(deskthrd, THREAD_PRIORITY_BELOW_NORMAL);
    20.     ResumeThread(deskthrd);
    21.  
    22.  
    23.     WaitForSingleObject(deskthrd, INFINITE);
    24.  
    25.  
    26.     CloseHandle(deskthrd);
    27.     CloseDesktop(newdesk);
    28.     return(0);
    29. }
    30.  
    31.  
    32. DWORD WINAPI DeskThreadProc(LPVOID lpParameter)
    33. {
    34.     DWORD curid;
    35.     curid = GetCurrentThreadId();
    36.  
    37.     HDESK newdesk, olddesk;
    38.     newdesk = *(HDESK *) lpParameter;
    39.     olddesk = GetThreadDesktop(curid);
    40.  
    41.     if (SetThreadDesktop(newdesk) == FALSE)
    42.         ExitThread(1);
    43. //  SwitchDesktop(newdesk);
    44.  
    45.     HDC  deskdc, backdc;
    46.     HBITMAP backbm, oldbm;
    47.  
    48.  
    49.     deskdc = GetDC(NULL);
    50.  
    51.     backdc = CreateCompatibleDC(deskdc);
    52.     backbm = CreateCompatibleBitmap(deskdc, 256, 256);
    53.     oldbm = (HBITMAP) SelectObject(backdc, backbm);
    54.  
    55.  
    56.     if (StretchBlt(backdc, 0, 0, 256, 256, deskdc, 0, 0, 1280, 1024, SRCCOPY) == FALSE) {
    57.         ErrorExit();
    58.     };
    59.  
    60.     ReleaseDC(NULL, deskdc);
    61.  
    62.  
    63.     if (SetThreadDesktop(olddesk) == FALSE)
    64.         ExitThread(4);
    65. //  SwitchDesktop(olddesk);
    66.  
    67.     deskdc = GetDC(NULL);
    68.     if (StretchBlt(deskdc, 0, 0, 1280, 1024, backdc, 0, 0, 256, 256, SRCCOPY) == FALSE) {
    69.         ErrorExit();
    70.     };
    71.     ReleaseDC(NULL, deskdc);
    72.  
    73.  
    74.     ExitThread(0);
    75. };
    76.  
    77.  
    78. void ErrorExit(void)
    79. {
    80.     LPTSTR pszMessage;
    81.     DWORD dwLastError = GetLastError();
    82.  
    83.     FormatMessage(
    84.         FORMAT_MESSAGE_ALLOCATE_BUFFER |
    85.         FORMAT_MESSAGE_FROM_SYSTEM |
    86.         FORMAT_MESSAGE_IGNORE_INSERTS,
    87.         NULL,
    88.         dwLastError,
    89.         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    90.         (LPTSTR)&pszMessage,
    91.         0, NULL );
    92.  
    93.     HDESK dsk = OpenInputDesktop(0, false, GENERIC_ALL);
    94.     SetThreadDesktop(dsk);
    95.     MessageBox(0, pszMessage, NULL, 0);
    96.     CloseDesktop(dsk);
    97.  
    98.     LocalFree(pszMessage);
    99.     ExitProcess(1);
    100. }
    Если раскомментировать SwitchDesktop то все работает. Но на экране отображается созданный рабочий стол. В чем может быть проблема и куда копать?