0

Vista 推出了一项新的安全措施,阻止会话 0 访问视频卡等硬件,并且用户不再登录会话 0。我知道这意味着我无法向用户显示 GUI,但是,这是否也意味着我不能显示一个吗?我的代码现在设置的方式,只使它成为命令行会做更多的工作,但是如果我可以使用我现有的代码并且只是以编程方式管理 GUI,它将需要更少的代码。

这可能吗?

MSDN 的文章是这样说的:

• 服务尝试在会话 0 中创建用户界面 (UI),例如对话框。由于用户未在会话 0 中运行,因此他或她永远看不到 UI,因此无法提供服务正在运行的输入寻找。该服务似乎停止运行,因为它正在等待未发生的用户响应。

这让我觉得有可能拥有一个自动化的 UI,但有人告诉我你不能将 SendKeys 与服务一起使用,因为它在 Session 0 中被禁用。

编辑:我实际上不需要向用户展示 GUI

4

3 回答 3

1

你可以展示一个;它只是没有出现。

任务栏中有一个关于有一个 GUI 窗口和切换到它的方法的小通知。

无论如何,实际上有一个 TerminalServices API 命令来切换活动会话,如果您真的需要它显示,您可以调用它。

于 2009-01-21T21:14:06.223 回答
0

您可以编写一个单独的流程,为您的服务流程提供 UI。您的 UI 和服务进程之间的通信可以通过多种方式完成(在 Web 上搜索“进程间通信”或“IPC”)。

于 2009-01-21T21:17:35.327 回答
0

您的服务可以有一个 GUI。只是没有人会看到它。正如 MSDN 引用所暗示的,服务可以显示一个对话框。调用MessageBox不会失败;它永远不会回来——不会有人按下它的按钮。

我不确定您想要“管理 GUI”是什么意思。你真的是说假装向控件发送输入,就像SendInput? 我看不出有什么不可能的理由。毕竟,您会将输入注入您自己的程序队列,而SendInput特定于 Vista 的警告并没有说明这一点。但我认为你会让事情变得比他们需要的复杂得多。重新考虑将程序更改为完全没有 UI 的想法。(这与拥有控制台程序不同。控制台是 UI。)

例如,不要模拟单击按钮所需的鼠标消息,而是消除中间人并直接调用按钮单击事件将调用的函数。

于 2009-01-21T22:35:20.613 回答