可以 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,然后通过管道或套接字或其他通信技术将其发送到服务
我正在尝试从用 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,然后通过管道或套接字或其他通信技术将其发送到服务