我有相同的用户登录到具有多个同时会话的Windows 7工作站(例如并发RDP或在工作站登录,然后通过RDP登录)。
更新 好吧,我对这个问题的研究一直停留在这一点上(python示例编写不太复杂的代码):
#!/usr/bin/env python
import ctypes
import ctypes.wintypes as wintypes
def enum_desktops():
GetProcessWindowStation = user32.GetProcessWindowStation
EnumDesktops = user32.EnumDesktopsW
EnumDesktopsProc = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.LPWSTR, wintypes.LPARAM)
hwinsta = GetProcessWindowStation()
def foreach_desktop(desk_name, lparam):
print("Desktop %s"%desk_name)
return True
EnumDesktops(hwinsta, EnumDesktopsProc(foreach_desktop), desk_lparam)
此功能打印有关“默认”和“Winlogon”dektops的信息。如果我们尝试枚举窗口站,我们将获得仅“WinSta0”,而我可以看到在不同的登录会话上启动了潜在的目标进程。
那么,我应该使用什么来查找目标桌面的窗口?
守护进程在这一点上根本不是一个选项。
答案 0 :(得分:2)
拥有随每个桌面会话启动的后台应用程序或任务托盘小程序。 (通过向以下注册表项添加EXE路径轻松安装:HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ Current Version \ Run)。
安装在该应用程序中的代码将执行两项操作:
您需要执行的所有桌面窗口枚举和操作只能与本地桌面交互。
充当您在其他桌面会话上运行的“服务器”应用的“客户端”。您的服务器应用程序触发客户端进行窗口扫描。您可以使用几乎所有的进程间通信机制。
答案 1 :(得分:0)
问题发布时已经过了一段时间,但如果有人需要,我会发一个答案。
您需要做的是为当前线程设置一个桌面,即调用FindWindow
。这样,您的调用线程将在其他桌面上运行,并将找到一个窗口。为此,您必须使用SetThreadDesktop
WinAPI函数。
有关详细信息,请查看SetThreadDesktop上的MSDN文档。