我有一个程序将命令行传递给资源管理器进程以在用户的非提升桌面上下文中执行。这样做的一部分需要使用 IShellWindows::FindWindowSW 来搜索桌面窗口,如Windows 7 SDK 中的ExecInExplorer 示例所示。
如果由于某种原因资源管理器重新启动(例如“退出资源管理器”并重新启动 [2])并且旧资源管理器实际上并未退出,则 FindWindowSW 为桌面窗口返回 S_FALSE。在这种情况下,新的资源管理器进程拥有桌面,而旧进程(应该已经终止)不拥有。我怀疑 FindWindowSW 只搜索旧的资源管理器进程。
如果有多个资源管理器正在运行,是否有任何方法可以在所有资源管理器中搜索 IDispatch 到桌面?
#include <windows.h>
#include <shlwapi.h>
#include <shlobj.h>
#include <stdio.h>
#include <malloc.h>
#pragma comment(lib, "shlwapi.lib")
int main(int argc, char *argv[]) {
(argv); (argc);
init();
HRESULT hr;
IShellWindows *psw;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&psw));
if (SUCCEEDED(hr))
{
HWND hwnd;
IDispatch* pdisp;
VARIANT vEmpty = {}; // VT_EMPTY
HRESULT f = psw->FindWindowSW(&vEmpty, &vEmpty, SWC_DESKTOP, (long*)&hwnd, SWFO_NEEDDISPATCH, &pdisp);
if(f == S_OK)
printf("S_OK, hwnd: 0x%lx\n", *(long*)&hwnd);
else if(f == S_FALSE)
printf("S_FALSE\n");
else
printf("0x%lx\n", f);
}
}
return 0;
}
[2]:(有时我在开发时会“退出资源管理器”(按住 CTRL+SHIFT 并右键单击开始菜单的空白部分),然后从命令提示符处重新启动它。尽管退出,偶尔也会出现资源管理器(即任务栏消失)实际上并没有终止,这意味着当我再次启动资源管理器时,会运行多个资源管理器。仍在运行的旧资源管理器不是可用于显示文件夹的单独进程。我没有办法重现这个,这似乎是任意的。)