3

Недавно мне удалось достать старый компакт-диск Starcraft, который выкинул мой друг, и, всегда любя играть в Starcraft, установил его на свой компьютер с Windows 7, обновил его последними патчами и попытался запустить. У него были некоторые проблемы, и он несколько раз падал, но я нашел решение, в котором просто закройте все процессы обозревателя, запустите starcraft и снова запустите explorer. Поэтому я написал небольшой пакетный файл:

@ECHO OFF
REM RunStartcraft.bat
REM Closes Explorer, runs StarCraft then starts Explorer again
title Run Starcraft
echo Stopping Explorer...
taskkill /f /im explorer.exe
echo Running Starcraft...
StarCraft.exe
echo  Restarting Explorer...
start explorer.exe

и это работает.

Однако что мне не нравится в этом пакетном файле, так это в том, что он убивает все процессы Explorer, а не закрывает их (включая базовый процесс Explorer). Можно ли аккуратно закрыть Проводник (например, щелкнув правой кнопкой мыши по меню «Пуск» и щелкнув «Выход из Проводника»), не прерывая процессы в пакетном файле? Или не имеет значения, уничтожу ли я все процессы проводника?

РЕДАКТИРОВАТЬ: я не пытаюсь получить список запущенных процессов Explorer, но мне интересно, можно ли изящно выйти из процесса (ов) Explorer без необходимости внезапно завершить / завершить процесс с помощью taskkill.

2 ответа2

3

Эй смотри! Кросс-сайт дубликат ! :D

Я сделал и загрузил программу, которая пытается остановить и запустить Explorer. Это не всегда работает, в зависимости от состояния Explorer, но обычно работает. :)

Вот (короткий) исходный код, написанный на D:

import core.stdc.wchar_, core.sys.windows.windows;
struct STARTUPINFOW { DWORD cb; LPWSTR lpReserved, lpDesktop, lpTitle; DWORD dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput, hStdOutput, hStdError; }
struct PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; }
extern(C) static int D15TypeInfo_Struct6__vtblZ = 0; //Don't need this
extern(C) ubyte[1024] D4core3sys7windows7windows16WIN32_FIND_DATAW6__initZ; //Don't need this
pragma(lib, "msvcrt.lib"); pragma(startaddress, mainCRTStartup);
int mainCRTStartup() //NOT  int main(), since we don't need Phobos or the D runtime
{
    const HWND hWnd = FindWindowW("Shell_TrayWnd", null);
    if (hWnd != null)
    {
        DWORD pid;
        GetWindowThreadProcessId(hWnd, pid);
        HANDLE hProcess = OpenProcess(0x00100000, false, pid);
        wchar pathBuf[32 * 1024] = void;
        auto si = STARTUPINFOW(STARTUPINFOW.sizeof);
        PROCESS_INFORMATION pi;
        if (hProcess != null && ExpandEnvironmentStringsW(r"%SystemRoot%\explorer.exe", pathBuf.ptr, pathBuf.length) > 0
            && SendMessageW(hWnd, 0x5B4, 0, 0) == 0 && WaitForSingleObject(hProcess, INFINITE) == 0)
                return !CreateProcessW(pathBuf.ptr, null, null, null, false, 0x04000608, null, null, si, pi);
    }
    return -1;
}
extern (Windows)
{
    BOOL SendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    HWND FindWindowW(LPCWSTR lpClassName, LPCWSTR lpWindowName);
    BOOL CreateProcessW(in LPCWSTR, LPWSTR, in LPSECURITY_ATTRIBUTES, in LPSECURITY_ATTRIBUTES, in BOOL, in DWORD, in LPVOID, in LPCWSTR, ref STARTUPINFOW, out PROCESS_INFORMATION);
    HANDLE OpenProcess(in DWORD dwDesiredAccess, in BOOL bInheritHandle, in DWORD dwProcessId);
    DWORD GetWindowThreadProcessId(HWND hWnd, out DWORD lpdwProcessId);
    DWORD ExpandEnvironmentStringsW(in LPCWSTR lpSrc, LPWSTR lpDst, in DWORD nSize);
}

Надеюсь, это поможет!

0

Попробуйте tasklist /FI "IMAGENAME eq explorer.exe" .

Обратите внимание, что вам может потребоваться запустить это повышенное, если вы хотите видеть задачи, выполняемые Системой или другими пользователями.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .