Проблема с рабочими столами - PullRequest
2 голосов
/ 07 мая 2009

У меня есть этот код:

#define _WIN32_WINNT 0x0500
#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[])
{
    Sleep(500);
    HDESK hOriginalThread;
    HDESK hOriginalInput;
    hOriginalThread = GetThreadDesktop(GetCurrentThreadId());
    hOriginalInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP);


    HDESK hNewDesktop=CreateDesktop("Test",NULL,NULL,0,DELETE|READ_CONTROL|WRITE_DAC|WRITE_OWNER|GENERIC_ALL,NULL);

    cout<<SetThreadDesktop(hNewDesktop);
    Sleep(575);
    SwitchDesktop(hNewDesktop);
    system("cmd");
    Sleep(1000);
    SwitchDesktop(hOriginalInput);
    SetThreadDesktop(hOriginalThread);
    CloseDesktop(hNewDesktop);
    CloseDesktop(hOriginalInput);
    Sleep(1000);
    return 0;
}

Когда я запускаю это, он создает новый рабочий стол, переключается на него, но командная строка не появляется. Я должен вручную завершить процесс "cmd", и моя программа затем продолжится. Есть ли способ показать окно любого приложения на другом рабочем столе? И как я могу изменить фон рабочего стола, который я создал? Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 07 мая 2009

Вы можете выбрать рабочий стол для запуска приложения при запуске приложения.

STARTUPINFO si = {0};
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = L"winsta0\\Default";

Затем передайте эту структуру в CreateProcess или CreateProcessAsUser .


Вы также можете выбрать, в какой сеанс запустить приложение (включите столбец идентификатора сеанса в диспетчере задач, чтобы увидеть, какой из них вам нужен)

Вы можете создать процесс в другом сеансе, используя: SetTokenInformation

на токене, который вы используете в CreateProcessAsUser, передавая TokenSessionId

Вы не можете изменить сеанс уже запущенного процесса.

0 голосов
/ 07 мая 2009

Не используйте * функции рабочего стола, я обещаю, что они не делают то, что, как вы думаете, они делают, они являются пережитком NT4 - вы действительно пытаетесь создать новый сеанс, а ОС владеет созданием сеансов. Только не делай этого.

- парень, который работает в Windows org

0 голосов
/ 07 мая 2009

Вы просто пытаетесь запустить "cmd" в неблокирующем режиме? Я считаю, что вы можете сделать это в Windows с:

system(1, "cmd");
...