我有这段代码:
#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时,桌面切换到原始程序将关闭,但是如果我在第二个桌面上运行任何程序,则不要终止,当我再次运行程序时,将出现任何程序。有没有办法删除带有程序的桌面,或者在退出时通过第二个桌面自动终止程序? 请帮忙。
答案 0 :(得分:4)
如果您想强制终止以CreateProcess
开头的程序(如您发布的代码中所示),那么您可以在TerminateProcess
中返回的句柄上使用PROCESS_INFORMATION
结构。
如果你想终止所有带有新线程附加线程的进程,无论你是否启动它们,那么它有点(好吧,很多)更复杂。您的代码必须执行以下操作:
CreateToolhelp32Snapshot
)CreateToolhelp32Snapshot
)GetThreadDesktop
)GetUserObjectInformation
)OpenProcess
和TerminateProcess
)这需要编写很多代码,但它应该有效。
答案 1 :(得分:-1)
您可以编写一个simle DLL,它将使用套接字返回GetStartupInfo。并且你必须在所有进程中注入你的dll并使用CreateRemoteThread执行你的dll并在StartupInfo数据来之后解除注入。
抱歉我的英语不好..