Как я могу удалить рабочий стол Win32 с запущенными программами и завершить эти программы? - PullRequest
1 голос
/ 07 мая 2009

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

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

using namespace std;

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


    HDESK hNewDesktop=CreateDesktop("BasicAppDesktopDesktop",NULL,NULL,0,DELETE|READ_CONTROL|WRITE_DAC|WRITE_OWNER|GENERIC_ALL,NULL);
    /*HDESK hNewDesktop=OpenDesktop("Winlogon", 0, FALSE,
                        DESKTOP_CREATEMENU |
                        DESKTOP_CREATEWINDOW |
                        DESKTOP_ENUMERATE    |
                        DESKTOP_HOOKCONTROL  |
                        DESKTOP_JOURNALPLAYBACK |
                        DESKTOP_JOURNALRECORD |
                        DESKTOP_READOBJECTS |
                        DESKTOP_SWITCHDESKTOP |
                        DESKTOP_WRITEOBJECTS);
                        */

    SetThreadDesktop(hNewDesktop);
    SwitchDesktop(hNewDesktop);
    //system("cmd");
    STARTUPINFOA si = {0};
    si.cb = sizeof(STARTUPINFO);
    si.lpDesktop = "winsta0\\BasicAppDesktopDesktop";
    PROCESS_INFORMATION infos;
    CreateProcess(NULL,"explorer",NULL,NULL,false,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&infos);
    //WaitForSingleObject( infos.hProcess, INFINITE );
    while(!(GetAsyncKeyState(VK_F12) == -32767))Sleep(50);
    CloseHandle( infos.hProcess );
    CloseHandle( infos.hThread );

    SwitchDesktop(hOriginalInput);
    SetThreadDesktop(hOriginalThread);
    CloseDesktop(hNewDesktop);
    CloseDesktop(hOriginalInput);
    return 0;
}

Когда я нажимаю F12, рабочий стол переключается на исходный и программа закрывается, но если я запускаю на втором рабочем столе какую-либо программу, то не завершается, и когда я снова запускаю свою программу, эта программа появляется. Есть ли способ удалить рабочие столы с программами, или автоматические завершения программ запускались через второй рабочий стол при выходе? Пожалуйста, помогите.

Ответы [ 2 ]

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

Если вы хотите принудительно завершить работу программы, которую вы начали с CreateProcess (как в коде, который вы опубликовали), то вы можете просто использовать TerminateProcess в дескрипторе, возвращенном в вашей PROCESS_INFORMATION struct.

Если вы хотите завершить все процессы с потоками, присоединенными к вашему новому рабочему столу, независимо от того, запустили вы их или нет, то это немного (хорошо, очень) сложнее. Ваш код должен сделать следующее:

  1. Перечислить все запущенные процессы (используя CreateToolhelp32Snapshot)
  2. Перечислять потоки для каждого процесса по очереди (снова используя CreateToolhelp32Snapshot)
  3. Получить дескриптор рабочего стола для каждого потока (используя GetThreadDesktop)
  4. Получить имя этого рабочего стола (используя GetUserObjectInformation)
  5. Сравните с именем вашего рабочего стола
  6. Если имена совпадают, откройте новый дескриптор для родительского процесса и завершите его (OpenProcess и TerminateProcess)

Это много кода для написания, но оно должно работать.

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

Вы можете написать простую DLL, которая будет возвращать GetStartupInfo, используя сокеты. И вы должны внедрить вашу dll во все процессы и выполнить dll с CreateRemoteThread и деинжектировать после получения данных StartupInfo.

Извините за мой плохой английский ..

...