Installscript: как закрыть окна проводника без перезапуска процесса explorer.exe?

можно ли закрыть все окна проводника без перезапуска процесса explorer.exe?

Контекст: - Во время удаления установщика на основе installshield мне пришлось удалить dll, которая используется для отображения контекстного меню правой кнопки мыши для файлов. Во время деинсталляции мне пришлось удалить dll. К сожалению, он блокируется explorer.exe.

Можно ли просто закрыть окна проводника без перезапуска процесса explorer.exe?


person Engineer    schedule 19.07.2013    source источник


Ответы (2)


Я уверен, что вы могли бы вызвать FindWindow и использовать SendMessage, чтобы закрыть окна проводника, но процесс explorer.exe все еще будет запущен, и у вас все еще будет блокировка файла.

Установщик Windows может удалять заблокированные файлы при перезагрузке. Если вы не хотите перезагрузки, вам придется убить и перезапустить проводник.

Я не знаю других моделей здесь.

Пример FindWindow

Сообщение WM_SYSCOMMAND

person Christopher Painter    schedule 19.07.2013
comment
О, круто. Мне удалось удалить файл dll вручную сразу после закрытия всех окон проводника без перезапуска explorer.exe. Я думаю, что могу попробовать закрыть окна проводника в установочном скрипте. Было бы очень полезно для меня, если бы вы могли бросить какой-нибудь скрипт установки, который находит все окна проводника и закрывает их. - person Engineer; 19.07.2013
comment
Я не собираю сценарий установки для людей. Ответ обновлен, чтобы дать вам несколько советов. Надеюсь, что это работает... - person Christopher Painter; 19.07.2013
comment
Спасибо за обновление комментария. Пример ищет окно БЛОКНОТ. Моя цель - найти окно проводника. Я попытался найти дескриптор окна проводника, к сожалению, он не возвращает дескриптор. FindWindow(ExploreWClass,); Имя класса, которое я предоставил, предназначено для окна Explorer. Есть идеи, что пошло не так? - person Engineer; 22.07.2013
comment
Существует программа под названием Spy++, поставляемая с различными версиями Visual Studio и Microsoft SDK. Он покажет вам список всех оконных дескрипторов и названия их классов и заголовков. - person Christopher Painter; 22.07.2013

После стольких поисков в Google я смог придумать следующую программу на С++, которая просто закрывает окна проводника без перезапуска процесса explorer.exe.

Здесь я использую EnumWindows и перебираю все окна и закрываю только окна проводника только на основе имени класса окна.

#include "stdafx.h"
#include <iostream>
#include <fstream>
using  namespace std;

wofstream myfile;

BOOL CALLBACK enumWindowsProc(
  __in  HWND hWnd,
  __in  LPARAM lParam
) {


  int length = 255;

  TCHAR* buffer,*buffer1;
  buffer = new TCHAR[ length + 1 ];
  buffer1 = new TCHAR[ length + 1 ];
  memset( buffer, 0, ( length + 1 ) * sizeof( TCHAR ) );
  memset( buffer1, 0, ( length + 1 ) * sizeof( TCHAR ) );

  DWORD pid;
  DWORD dwThreadID = ::GetWindowThreadProcessId( hWnd, &pid);

  ::GetWindowText(hWnd,buffer,length +1);
  wstring windowTitle = wstring( buffer );
  delete[] buffer;

  //cout << windowTitle.c_str();
  ::GetClassName(hWnd,buffer1,length +1);
  wstring windowClass = wstring( buffer1 );
  delete[] buffer1;

  if(windowClass.compare(L"CabinetWClass") == 0 || windowClass.compare(L"ExploreWClass") == 0)
  {
      //::PostMessage(hWnd, WM_ENDSESSION, MAKEWORD(true,1), ENDSESSION_CLOSEAPP);
      //::PostMessage(hWnd, 0x5B4, 0, 0);
      PostMessage(hWnd,WM_CLOSE,0,0);
  }

  myfile << windowTitle.c_str();
  myfile << L"|" ;
  myfile << pid ;
  myfile << L"|" ;
  myfile << windowClass.c_str() ;
  myfile << L"\n" ;

  return TRUE;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
    myfile.open ("processes.txt");
    BOOL enumeratingWindowsSucceeded = ::EnumWindows( enumWindowsProc, NULL );
    cin.get();
    myfile.close();
    return 0;
}
person Engineer    schedule 23.07.2013