Sair de todos os processos do Explorer sem matá-los?

3

Recentemente eu consegui colocar minhas mãos em um antigo CD de Starcraft que um amigo meu estava jogando fora e, tendo sempre gostado de jogar StarCraft, instalei no meu PC com Windows 7, atualizei com os últimos patches e tentei rodá-lo . Ele teve alguns problemas e travou algumas vezes, mas eu encontrei uma solução que dizia simplesmente fechar todos os processos do explorador, rodar o StarCraft e executar o Explorer novamente. Então eu escrevi um pequeno arquivo em lote:

@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

e isso funciona.

No entanto, o que eu não gosto sobre este arquivo em lote é que ele mata todos os processos do Explorer, em vez de fechá-los bem (incluindo o processo básico do Explorer). É possível fechar o Explorer bem (como deslocar o botão direito do mouse no menu Iniciar e clicar em 'Sair do Explorer') sem matar os processos em um arquivo em lote? Ou não importa se eu mato todos os processos do explorador?

EDITAR: Eu não estou tentando obter uma lista de execução de processos do Explorer, mas estou querendo saber se é possível sair do (s) processo (s) do Explorer sem ter que abruptamente matar / terminar o processo usando tarefas.

    
por Kryten 12.05.2011 / 10:07

2 respostas

3

Ei, olhe! Uma duplicação entre sites ! : D

Eu fiz e enviei um programa que tenta parar e iniciar o Explorer . Nem sempre funciona, dependendo do estado do Explorer, mas geralmente acontece. :)

Aqui está o código-fonte (curto), escrito em 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);
}

Espero que ajude!

    
por 12.05.2011 / 10:41
0

Experimente tasklist /FI "IMAGENAME eq explorer.exe" .

Note que você pode precisar executar isso elevado se quiser ver as tarefas executadas pelo sistema ou por outros usuários.

    
por 12.05.2011 / 10:22