【问题标题】:integration of tools with GUI driver工具与 GUI 驱动程序的集成
【发布时间】:2010-01-21 04:34:53
【问题描述】:
我有这个只能通过其 GUI 访问的旧 Fortran 可执行文件,而且重写起来太复杂了。我需要将它集成到我们正在构建的工具中,因此我使用 White 库在 C# 中编写了一个 GUI 包装器(当然不理想,但我想不出更好的方法)。这可以正常工作,但是当我的程序运行时,GUI 会弹出,并且某些操作(例如列表框选择)会强制鼠标移动。我希望与 Fortran 工具的交互对用户透明。
我在这里阅读了几篇关于 user32 dll 中的 CreateDesktop 函数的帖子,该函数可能允许我在用户看不到的另一个桌面窗口上执行包装器。我还能在这样的桌面上自动进行 GUI 交互吗?我四处搜索,没有找到任何关于如何使用以这种方式创建的桌面的示例。有人对此有很好的参考吗?
或者,有没有更好的方法来完成这个过程?
【问题讨论】:
标签:
c#
user-interface
automation
desktop
wrapper
【解决方案1】:
桌面可能是实现您想要的目标的好方法。
桌面可以是不可见的,这允许自动化对等方操作 UI,而不会有输入焦点或弹出行为的风险。
桌面代表一个逻辑屏幕布局,上面有零个或多个 Windows。在 Win32 中有多种 API 方法可用于操作桌面并与之交互,包括(其中)CreateDesktop()。
每个桌面都有一个名称(例如“Default”“WinLogon”“MyOwnName”)并作为 Window Station 中的项目存在,从而产生诸如“WinSta0\Default”之类的全名。 NT 3.10 中引入了桌面。窗口句柄、窗口消息、“WindowHooks”等都存在于单个桌面中,并且不能跨越该边界。但是,可以在与您的应用运行的桌面不同的桌面上执行对等自动化(例如您使用 White 库描述的那种)。
与会话和窗口站不同,进程中的每个线程都可以连接到其进程的 WinStation 内的不同桌面,并且可以在任何没有任何窗口(甚至不隐藏)的线程中动态更改此关联那些)。安全方面,每个桌面都有自己的安全描述符。您可以通过调用 GetThreadDesktop() 来获取自己进程的桌面句柄,对于其他任务,OpenDesktop() 和 OpenInputDesktop() 和 CreateDesktop() 是有趣的 API。