2009-05-07 10 views
1

私はこのコードを持っている:私は、元のプログラムにF12、デスクトップスイッチを押すと実行中のプログラムで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; 
} 

は終了しますが、私は2番目のデスクトップに任意のプログラムを実行する場合は、終了をしない、と私は私のプログラムを実行すると、再びどのプログラムも表示されます。プログラムを使用してデスクトップを削除する方法はありますか、または終了時に2番目のデスクトップを介してプログラムの自動終了が実行されましたか? 助けてください。

答えて

4

あなたは(あなたが投稿したコードのように)CreateProcessで起動したプログラムの終了を強制したい場合は、その後、あなたは自分のPROCESS_INFORMATION構造体に返されたハンドルにTerminateProcessを使用することができます。

新しいデスクトップに接続されたスレッドですべてのプロセスを終了したい場合は、起動したかどうかにかかわらず、そのビット(OK、多く)がより複雑になります。あなたのコードは、次の操作を実行する必要があります:

  1. 列挙(再びCreateToolhelp32Snapshotを使用して)順番に各プロセスの
  2. 列挙スレッド
  3. CreateToolhelp32Snapshotを使用して)実行中のすべてのプロセスがGetThreadDesktopを使用して(各スレッドのデスクトップのハンドルを取得します。 )()GetUserObjectInformationを使用して
  4. はそのデスクトップの名前を取得します
  5. は、デスクトップの名前と比較し
  6. 名前が一致した場合、開きます新しい親プロセスへのハンドルと(OpenProcessTerminateProcessを)それを終了

書き込むために多くのコードだが、それが動作するはずです。

+0

ここにサンプルコードを投稿してください。 私はこの分野でのプログラミングを知らない。 –

+1

ドキュメントを読むことを検討しましたか? –

+2

@matej - 私があなたに与えた各機能のMSDNページを読めば、コードはほとんどそれ自身を書くでしょう;-) – snowcrash09

-1

ソケットを使用してGetStartupInfoを返すsimle DLLを書き込むことができます。また、すべてのプロセスにdllを注入し、CreateRemoteThreadでdllを実行し、StartupInfoデータが来た後に非インジェクションする必要があります。

私の悪い英語を申し訳ありません。

関連する問題