我想从我的C ++应用程序中杀死并重新启动explorer.exe,我该怎么做?
答案 0 :(得分:3)
识别应用程序的主窗口(例如,使用FindWindow)并向其发送WM_QUIT。
使用SendMessageTimeout()发送它;此函数允许您指定您愿意等待应用程序处理它的时间。如果由于超时到期而返回SendMessageTimeout(),则求助于TerminateProcess()。
这是SendMessageTimeout规范的链接:http://msdn.microsoft.com/en-us/library/ms644952(VS.85).aspx
答案 1 :(得分:2)
您可以使用 CreateProcess 来生成explorer.exe,并使用 TerminateProcess 来终止它。上面的回复中提到的 ExitProcess 仅适用于当前进程(即您从中调用ExitProcess的进程)。
您还可以使用 OpenProcess 来访问已通过其他方式创建的流程。
BOOL WINAPI TerminateProcess
(
__in HANDLE hProcess,
__in UINT uExitCode
);
CreateProcess具有以下签名:
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
注意最后一个参数,您应该将指针传递给PROCESS_INFORMATION结构。当CreateProcess返回时,此结构包含句柄,进程ID等。
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
}PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
如果您已经通过其他方式创建了流程,那么您将无法获得流程处理等信息。在这种情况下,您应该枚举这些进程并找到您感兴趣的进程。这在MSDN上进行了说明。 Enumerating All Processes
答案 2 :(得分:1)
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
void LaunchExplorer() {
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof( si ) );
si.cb = sizeof( si );
CreateProcess( "explorer.exe", NULL, NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi );
}
int main( int, char *[] ) {
PROCESSENTRY32 entry;
entry.dwFlags = sizeof( PROCESSENTRY32 );
HANDLE snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, NULL );
if ( Process32First( snapshot, &entry ) == TRUE ) {
while ( Process32Next( snapshot, &entry ) == TRUE ) {
if ( stricmp( entry.szExeFile, "explorer.exe" ) == 0 ) {
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, entry.th32ProcessID );
TerminateProcess( hProcess, 0 );
CloseHandle( hProcess );
break;
}
}
LaunchExplorer();
}
CloseHandle( snapshot );
return 0;
}
答案 3 :(得分:0)
由于现代Windows系统符合POSIX标准,因此您可以向外部进程发送KILL信号。但请注意,这将被转换为TerminateProcess调用,因此您也可以使用它。
答案 4 :(得分:0)
我的答案为时已晚,但以防万一需要它的人......
y
答案 5 :(得分:-1)
永远不要杀死资源管理器:它毫无意义!
只需使用Refreshing Win32 Shell apis。