【问题标题】:How can I delete a Win32 desktop with running programs, and terminate those programs?如何删除运行程序的 Win32 桌面并终止这些程序?
【发布时间】:2009-05-07 16:14:06
【问题描述】:

我有这个代码:

#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时,桌面切换到原始并且程序会关闭,但是如果我在第二个桌面运行任何程序,那么不要终止,当我再次运行我的程序时,任何程序都会出现。有没有办法删除带有程序的桌面,或者在退出时自动终止通过第二个桌面运行的程序? 请帮忙。

【问题讨论】:

    标签: c++ winapi windows-vista process desktop


    【解决方案1】:

    如果您想强制终止以CreateProcess 启动的程序(如您发布的代码中所示),那么您可以在PROCESS_INFORMATION 结构中返回的句柄上使用TerminateProcess

    如果您想终止所有带有附加到新桌面的线程的进程,无论您是否启动它们,那么它有点(好吧,很多)更复杂。您的代码必须执行以下操作:

    1. 枚举所有正在运行的进程(使用CreateToolhelp32Snapshot
    2. 依次为每个进程枚举线程(再次使用CreateToolhelp32Snapshot
    3. 获取每个线程的桌面句柄(使用GetThreadDesktop
    4. 获取该桌面的名称(使用GetUserObjectInformation
    5. 与您的桌面名称比较
    6. 如果名称匹配,则打开父进程的新句柄并终止它(OpenProcessTerminateProcess

    要写很多代码,但它应该可以工作。

    【讨论】:

    • 你能把示例代码贴在这里吗?我不知道这方面的编程。
    • @matej - 如果你阅读了我给你的每个功能的 MSDN 页面,代码几乎会自己编写 ;-)
    【解决方案2】:

    您可以编写一个简单的 DLL,它将使用套接字返回 GetStartupInfo。并且您必须在所有进程中注入您的 dll,并在 StartupInfo 数据到来后使用 CreateRemoteThread 执行您的 dll 并反注入。

    对不起我的英语不好..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2011-03-23
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多