问题描述
我有一个程序将命令行传递给资源管理器进程以在用户的非提升桌面上下文中执行。部分操作需要使用 IShellWindows::FindWindowSW 来搜索桌面窗口,如 Windows 7 SDK 中的 this ExecInExplorer example 所示。
如果由于某种原因重新启动了资源管理器(例如“退出资源管理器”并重新启动 [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 并右键单击开始菜单的空白部分)然后从命令提示符重新启动它。偶尔会使用资源管理器,尽管退出(即任务栏消失)实际上并未终止,这意味着当我再次启动资源管理器时,多个资源管理器正在运行。仍在运行的旧资源管理器不是可用于显示文件夹的单独进程。我没有一种重现这一点的方法,这似乎是随意的。)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)