如何在C ++中杀死然后重启进程?

时间:2009-05-14 16:41:55

标签: c++ windows winapi

我想从我的C ++应用程序中杀死并重新启动explorer.exe,我该怎么做?

6 个答案:

答案 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 来访问已通过其他方式创建的流程。

OpenProcess

TerminateProcess

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调用,因此您也可以使用它。

http://www.mkssoftware.com/docs/man1/kill.1.asp

答案 4 :(得分:0)

我的答案为时已晚,但以防万一需要它的人......

y

答案 5 :(得分:-1)

永远不要杀死资源管理器:它毫无意义!
只需使用Refreshing Win32 Shell apis。