0

我有一个程序将命令行传递给资源管理器进程以在用户的​​非提升桌面上下文中执行。这样做的一部分需要使用 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 并右键单击开始菜单的空白部分),然后从命令提示符处重新启动它。尽管退出,偶尔也会出现资源管理器(即任务栏消失)实际上并没有终止,这意味着当我再次启动资源管理器时,会运行多个资源管理器。仍在运行的旧资源管理器不是可用于显示文件夹的单独进程。我没有办法重现这个,这似乎是任意的。)

4

0 回答 0