无论如何要关闭所有资源管理器窗口而不重新启动 explorer.exe 进程?
上下文:-在卸载基于 installshield 的安装程序期间,我不得不删除一个 dll,该 dll 用于显示文件的右键单击上下文菜单。在卸载期间,我不得不删除 dll。不幸的是,它被 explorer.exe 锁定了。
无论如何只要关闭资源管理器窗口而不重新启动 explorer.exe 进程?
无论如何要关闭所有资源管理器窗口而不重新启动 explorer.exe 进程?
上下文:-在卸载基于 installshield 的安装程序期间,我不得不删除一个 dll,该 dll 用于显示文件的右键单击上下文菜单。在卸载期间,我不得不删除 dll。不幸的是,它被 explorer.exe 锁定了。
无论如何只要关闭资源管理器窗口而不重新启动 explorer.exe 进程?
在谷歌搜索了很多很多的踪迹之后,我可以想出下面的 c++ 程序,它只是关闭资源管理器窗口而无需重新启动 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;
}
我确定您可以调用 FindWindow 并使用 SendMessage 关闭资源管理器窗口,但 explorer.exe 进程仍将运行并且您仍将拥有文件锁定。
Windows Installer 可以在重新启动时删除锁定的文件。如果您不想重新启动,则必须杀死并重新启动资源管理器。
我知道这里没有其他模式。