Я хотел бы убить и перезапустить explorer.exe из моего приложения на C++, как бы я это сделал?Как я могу убить, а затем перезапустить процесс на C++?
ответ
Поскольку современные системы Windows совместимы с POSIX, вы можете отправить сигнал KILL внешним процессам. Однако обратите внимание, что это будет переведено на вызов TerminateProcess, поэтому вы можете просто использовать его.
Вы можете использовать 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.
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
}PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
Если у вас уже есть процесс, созданный другими способами, информация о дескрипторе процесса и т. Д. Будет недоступна для вас. В этом случае вы должны перечислить процессы и найти тот, который вас интересует. Это проиллюстрировано здесь на MSDN. Enumerating All Processes
Как мне найти ручку? – Malfist
Определите главное окно приложения (например, используя FindWindow) и отправьте его WM_QUIT.
Используйте SendMessageTimeout(), чтобы отправить его; эта функция позволяет указать, сколько времени вы готовы ждать, пока приложение обработает его. Если SendMessageTimeout() вернется из-за истечения таймаута, прибегните к TerminateProcess().
Вот ссылка на спецификации SendMessageTimeout: http://msdn.microsoft.com/en-us/library/ms644952(VS.85).aspx
У исследователя есть окно? – Malfist
#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;
}
Никогда не убить проводника: это не имеет никакого смысла!
Просто используйте Refreshing Win32 Shell apis.
Мой ответ слишком поздно, но только в том случае, для кого-то, кто нуждается в этом ...
/////////////////////////////////////////////////////////////////////////////
bool _killExplorer()
{
CString strCmd1_KillExplorer = _T("taskkill /f /im explorer.exe");
PROCESS_INFORMATION pi;
STARTUPINFO si = { sizeof si };
bool bCmd = true;
TCHAR szCmdTmp[MAX_PATH];
_tcscpy(szCmdTmp, (LPCTSTR)strCmd1_KillExplorer);
if (CreateProcess(NULL, (LPTSTR)szCmdTmp, NULL, NULL, NULL, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD dwCode = 0;
if (!GetExitCodeProcess(pi.hProcess, &dwCode))
bCmd = false;
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
else {
bCmd = false;
}
return bCmd;
} // _killExplorer()
bool _startExplorer()
{
CString strCmd2_StartExplorer = _T("%systemroot%\\sysnative\\cmd.exe /c start /B explorer.exe");
TCHAR szCmdTmp[MAX_PATH];
DWORD dwSize = MAX_PATH;
ExpandEnvironmentStrings((LPCTSTR)strCmd2_StartExplorer, szCmdTmp, dwSize);
PROCESS_INFORMATION pi;
STARTUPINFO si = { sizeof si };
bool bCmd = true;
if (CreateProcessW(NULL, (LPTSTR)szCmdTmp, NULL, NULL, NULL, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD dwCode = 0;
if (!GetExitCodeProcess(pi.hProcess, &dwCode))
bCmd = false;
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
else {
bCmd = false;
}
return bCmd;
} // _startExplorer()
void RestartExplorer()
{
if (_killExplorer()) {
_startExplorer();
}
}
- 1. Ошибка EADDRINUSE, если я заставляю убить процесс, а затем попытаюсь перезапустить его
- 2. Как я могу убить бесконечный процесс PHP?
- 3. Как я могу убить раздвоенный процесс на C++?
- 4. Как убить процесс C#?
- 5. Как я могу убить процесс explorer.exe?
- 6. Как я могу убить этот процесс?
- 7. Как открыть браузер, а затем убить его?
- 8. Почему я не могу убить процесс JBoss?
- 9. Могу ли я убить этот процесс?
- 10. В RSpec 2, как я могу запустить процесс, запустить несколько примеров и затем убить этот процесс?
- 11. Как перезапустить процесс в bash или убить его по команде?
- 12. как убить процесс uWSGI
- 13. Как эффективно убить процесс на C++ (Win32)?
- 14. Убить процесс Excel C#
- 15. Как я могу убить процесс с длинным именем, используя tskill?
- 16. Как убить процесс зомби
- 17. Как я могу убить процесс в ActiveState Perl?
- 18. Как я могу убить процесс nodemon после запуска тестов mocha?
- 19. Могу ли я убить процесс console-kit-dae на ubuntu?
- 20. Как убить рутинный процесс
- 21. C# не удалось убить процесс
- 22. убить фоновый процесс на SIGINT
- 23. Как я могу убить процесс как пользователь www-data
- 24. Убить процесс на удаленной машине в C#
- 25. C#: Запустите процесс, а затем убейте его с помощью кнопки
- 26. Как убить/перезапустить долгое задание
- 27. Как я могу убить процесс, используя VBScript, запущенный конкретным пользователем
- 28. Как убить CMD-процесс?
- 29. Как убить процесс mysql через C#
- 30. Как убить открытый процесс на node.js?
я настоятельно рекомендую не делать этого, так как вы можете ввести некоторые неприятные дыры в безопасности. Обратите внимание на то, что продукты Microsoft всегда спрашивают вас, как закрыть и перезагрузить компьютер? Вот почему ... –
Я понимаю, что происходит. Я меняю настройки автозапуска, но реестр и проводник необходимо перезапустить, чтобы он вступил в силу. – Malfist