2009-05-07 5 views
1

J'ai ce code:Comment puis-je supprimer un bureau Win32 avec des programmes en cours d'exécution et mettre fin à ces programmes?

#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; 
} 

Lorsque j'appuie sur F12, commutateur de bureau à l'original et le programme se fermera, mais si je cours dans le deuxième bureau tout programme, alors ne se termine, et quand je lance à nouveau mon programme , que tout programme apparaîtra. Y a-t-il un moyen de supprimer des bureaux avec des programmes, ou des terminaisons automatiques de programmes ont couru à travers le deuxième bureau à la sortie? S'il vous plaît aider.

Répondre

4

Si vous voulez forcer la fin d'un programme qui vous avez commencé avec CreateProcess (comme dans le code affiché), vous pouvez simplement utiliser TerminateProcess sur la poignée de retour dans votre struct PROCESS_INFORMATION.

Si vous souhaitez terminer tous les processus avec des threads attachés à votre nouveau bureau, que vous les ayez démarrés ou non, alors c'est un peu plus compliqué (ok, beaucoup). Votre code devrait faire ce qui suit:

  1. Enumérer tous les processus en cours d'exécution (en utilisant CreateToolhelp32Snapshot)
  2. fils Énumérer pour chaque processus, à son tour (en utilisant à nouveau CreateToolhelp32Snapshot)
  3. Get poignée de bureau pour chaque fil (utilisant GetThreadDesktop)
  4. Obtenir le nom de ce bureau (à l'aide GetUserObjectInformation)
  5. Comparer avec le nom de votre bureau
  6. Si les noms correspondent, ouvrez une nouvelle poignée au processus parent et y mettre fin (OpenProcess et TerminateProcess)

C'est beaucoup de code à écrire, mais il devrait fonctionner.

+0

Pouvez-vous s'il vous plaît envoyer un code d'échantillon ici? Je ne connais pas la programmation dans ce domaine. –

+1

Avez-vous envisagé de lire la documentation? –

+2

@matej - si vous lisez les pages MSDN pour chacune des fonctions que je vous ai données, le code va presque s'écrire lui-même ;-) – snowcrash09

-1

Vous pouvez écrire une DLL simle pour qu'elle renvoie GetStartupInfo à l'aide de sockets. Et vous devez injecter votre DLL dans tous les processus et exécuter votre DLL avec CreateRemoteThread et désinjecter après que les données StartupInfo sont venues.

Désolé pour mon mauvais anglais ..

Questions connexes