0

我有同一个用户通过多个同时会话登录到 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”桌面的信息。如果我们尝试枚举窗口站,我们只会得到 WinSta0”,而我可以看到潜在的目标进程在不同的登录会话中启动。

那么,我应该使用什么来查找目标桌面的窗口?

守护进程此时根本不是一个选项。

4

2 回答 2

2

有一个后台应用程序或任务托盘小程序,每次桌面会话都会启动。(通过将 EXE 路径添加到以下注册表项即可轻松安装:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Run)。

存在于已安装应用程序中的代码将做两件事:

  1. 您需要做的所有桌面窗口枚举和操作只能与本地桌面交互。

  2. 充当在另一个桌面会话上运行的“服务器”应用程序的“客户端”。您的服务器应用程序是触发客户端进行窗口扫描的原因。为此,您几乎可以使用任何所需的进程间通信机制。

于 2013-03-09T23:30:20.393 回答
0

自发布问题以来已经过去了一段时间,但如果有人需要,我会发布答案。

您需要做的是为当前线程设置一个桌面,该线程正在调用FindWindow. 这样,你的调用线程就会在其他桌面上运行,并且会找到一个窗口。为此,您必须使用SetThreadDesktopWinAPI 函数。

有关详细信息,请查看SetThreadDesktop上的 MSDN 文档。

于 2014-11-30T17:58:02.640 回答