2009-05-07 5 views
1

У меня есть этот код:Как удалить рабочий стол Win32 с запущенными программами и завершить работу этих программ?

#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, настольный переключатель на оригинал и программа будет закрыть, но если я бегу на втором рабочем столе любую программу, то не завершается, и когда я запускаю свою программу еще раз , что появится любая программа. Есть ли способ удалить рабочие столы с программами или автоматическое завершение программ, запущенных во втором рабочем столе при выходе? Пожалуйста, помогите.

ответ

4

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

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

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

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

+0

Не могли бы вы разместить здесь образец кода? Я не знаю программирования в этой области. – 2009-05-07 17:44:53

+1

Рассматривали ли вы чтение документации? –

+2

@matej - если вы прочитали страницы MSDN для каждой из функций, которые я вам дал, код будет почти писать сам ;-) – snowcrash09

-1

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

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