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

Windows 从其他桌面查找应用程序上的窗口,windows,winapi,windows-7,Windows,Winapi,Windows 7,我让同一个用户同时使用几个会话登录到Windows7工作站(如并发RDP或在工作站上登录,然后通过RDP) 更新: 好的,我在这个问题上的研究一直停留在这一点上(编写不太复杂代码的python示例): 此函数用于打印有关“默认”和“Winlogon”devktops的信息。如果我们尝试枚举窗口站,我们只会得到“WinSta0”,而我可以看到在不同的登录会话上启动的潜在目标进程 那个么,我应该使用什么来查找目标桌面的窗口呢 守护进程在这一点上根本不是一个选项。有一个后台应用程序或任务托盘小程序,在

我让同一个用户同时使用几个会话登录到Windows7工作站(如并发RDP或在工作站上登录,然后通过RDP)

更新: 好的,我在这个问题上的研究一直停留在这一点上(编写不太复杂代码的python示例):

此函数用于打印有关“默认”和“Winlogon”devktops的信息。如果我们尝试枚举窗口站,我们只会得到“WinSta0”,而我可以看到在不同的登录会话上启动的潜在目标进程

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


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

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

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

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

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


  • 从问题发布到现在已经有一段时间了,但是如果有人需要,我会发布一个答案

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


    有关更多信息,请查看上的MSDN文档。

    如果确实没有办法或太复杂,我将在每个桌面上启动守护进程以控制windows。什么是同时会话?你指的是一个特定的应用程序或多个相同的用户交互会话。并发RDP,就像服务器软件一样,我想不出任何好的方法来做到这一点。您可以实现登录脚本来写入共享以进行登录,然后每晚/注销时清除它。也许可以通过客户端上的事件来打开RDP会话。。。我想不出什么真正干净的东西,除非有一些终端服务器或类似的软件可以用来代替裸RDP。通过从不同的桌面会话枚举窗口,你真正想做什么?你这样做的目的是什么。我这样问是因为可能有更好的方法。正如我在第一个选项中所评论的那样。在这个客户机服务器中最糟糕的事情是没有办法轻松地实现脚本支持。@EirNym-您试图实现的目标并不容易。因此,你将不得不做一些艰苦(但并非不可能)的工作来实现这一点。我不知道你为什么因为缺少脚本支持而拒绝我的答案,因为你在最初的问题中从未提到过。你似乎故意含糊其辞,你试图做什么,因此,你可能不会得到最好的答案。客户端/服务器的想法只是一个想法。通过让服务器将脚本文件推送到客户端并让客户端运行,您可以轻松地将“脚本”添加到其中。但我必须编写更多的代码,以便稍后将其移动到垃圾箱。@Eirnym,别忘了生成一个不同的线程,您将在该线程上调用
    SetThreadDesktop
    。否则,如果从
    MainThread
    调用它,它将无法工作。
    #!/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)