我想编写一个应用程序,给定一些网络输入,模拟鼠标移动、点击和键盘输入。我如何以及为什么要这样做是一个不同的讨论:-) 我想从 SO 那里听到的是,对于这样的应用程序/服务来说,什么是更可取的模型?
- 我应该让一个作为系统运行在后台的 Windows 服务吗?
- 或者我应该制作一个位于托盘中的托盘应用程序来监听和操纵用户的输入?
我还没有开始研究它,所以我想象的一些事情会让我感到困惑,这与没有交互式会话和/或权限的服务有关。
有什么我应该预料或记住的吗?
我想编写一个应用程序,给定一些网络输入,模拟鼠标移动、点击和键盘输入。我如何以及为什么要这样做是一个不同的讨论:-) 我想从 SO 那里听到的是,对于这样的应用程序/服务来说,什么是更可取的模型?
我还没有开始研究它,所以我想象的一些事情会让我感到困惑,这与没有交互式会话和/或权限的服务有关。
有什么我应该预料或记住的吗?
如果您打算在 Vista 和 Windows 7 上运行您的代码,那么 Windows 服务将是不够的,因为它们无法再与用户桌面交互。如果要操作用户输入,则需要在用户会话中运行一个程序。
一种替代方法是编写一个用于监控网络事件的服务,在用户登录时启动客户端,并使用 IPC 在两者之间进行通信。
编辑: NetworkService 应该足以满足服务权限。
正如 Aaron 建议的那样,让 Windows 服务监控网络。
至于用户会话中进程的 IPC,您可以使用 WCF,命名管道可能是最好的传输方式,但您需要以正确的方式设计它以跨越会话边界。使 Service 进程成为 WCF 服务,使用双工契约:用户会话进程调用服务进行注册,然后通过回调契约将事件传递回用户会话进程。有关这些问题的解释,请参阅此问题。
Aaron 给出了所有论点,为什么你不能没有托盘应用程序,但为什么要增加通过 IPC 与应用程序通信的服务的复杂性呢?
当您需要在没有用户登录的情况下运行代码时,服务很有用。这里不是这种情况,对吧?
除非您必须同时操作多个登录用户的输入,否则我只会使用托盘应用程序来执行监视网络事件和操作用户输入的任务,这对我来说更简单。