从其他桌面查找应用程序上的窗口

时间:2013-03-07 19:04:25

标签: windows winapi windows-7

我有相同的用户登录到具有多个同时会话的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”,而我可以看到在不同的登录会话上启动了潜在的目标进程。

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

守护进程在这一点上根本不是一个选项。

2 个答案:

答案 0 :(得分:2)

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

安装在该应用程序中的代码将执行两项操作:

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

  2. 充当您在其他桌面会话上运行的“服务器”应用的“客户端”。您的服务器应用程序触发客户端进行窗口扫描。您可以使用几乎所有的进程间通信机制。

答案 1 :(得分:0)

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

您需要做的是为当前线程设置一个桌面,即调用FindWindow。这样,您的调用线程将在其他桌面上运行,并将找到一个窗口。为此,您必须使用SetThreadDesktop WinAPI函数。

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