可以 windows 服务枚举桌面顶层 windows

can windows service enumerate desktop top level windows

我正在尝试从用 c++ 编码的服务中枚举顶级 windows 我想找到一个有多个实例的特定程序 运行 但我想要一个在其 window 标题

中有一些独特单词的特定程序

所以我正在使用此代码:

 auto desktop = OpenInputDesktop( 0, FALSE, DESKTOP_READOBJECTS);
 if (!desktop) log_file << "[*] OpenDesktopA failed with error : " << GetLastError() << endl;
BOOL rs = EnumDesktopWindows(desktop, EnumProc, 0);
if (!rs) log_file << "[*] EnumDesktopWindows failed with error : " << GetLastError() << endl;

EnumDesktopWindows 在没有调用 EnumProc 的情况下失败,因此 GetLastError returns 零

相同的代码在非服务程序中有效

是否可以在服务中执行此操作,但我做错了什么? 还是我做不到?

发现上述问题之一,是访问权限 我应该改用此访问权限:

auto desktop = OpenInputDesktop(0, 0, GENERIC_ALL); // GENERIC_READ also enough
EnumDesktopWindows(desktop, EnumProc, 0);

但是我只有两个 windows:HPSISVC,默认 IME 而 运行 普通程序中的此代码打印所有 windows 标题

最终的解决方案似乎是创建一个辅助进程,它将列出 windows 并找到所需 windows 的 ID,然后通过管道或套接字或其他通信技术将其发送到服务