如果资源管理器重新启动,IShellWindows::FindWindowSW 为桌面返回 S_FALSE

问题描述

我有一个程序将命令行传递给资源管理器进程以在用户的​​非提升桌面上下文中执行。部分操作需要使用 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...