【问题标题】:Change Display Resolution from Windows Service (Windows 7)从 Windows 服务更改显示分辨率 (Windows 7)
【发布时间】:2012-02-28 18:49:25
【问题描述】:

( 大家好。我对 Windows 编程很陌生,所以如果已经有人问过这个问题并且我只是不知道要搜索什么,我提前道歉,但是这个问题一直让我发疯,我知道有人可能很容易回答这个问题。)

我的公司有一个在 Windows 7 中作为服务运行的应用程序。我的任务是编写代码来更改显示设置,但我显然无法通过系统服务执行此操作。我创建了一个小型可执行文件,它在大约 5-10 行代码中将颜色深度更改为 8bpp,但是当我将此代码放入我的应用程序时,它返回成功但实际上并未成功(没有任何变化)。

在没有全面了解 Windows 编程工作原理的情况下,我设法尝试了数百万种不同的方法来使其正常工作,但无济于事。有人可以帮我找到我需要做些什么来使这个代码起作用吗?

【问题讨论】:

  • 你不能。服务在与 Vista 及更高版本中的用户不同的桌面下运行,因此无法访问用户的桌面。
  • 我在某处发现了一个帖子,说这是可能的。 support.microsoft.com/kb/249677 我确实试过了,但是 SetThreadDesktop 失败了,错误代码为 0。另外,有人告诉我 Spice Desktop Agent 可以完成这个,所以它一定是可能的!
  • 那篇知识库文章可以追溯到服务与交互式桌面在同一会话中运行的日子,即 XP 时间。那些日子早已一去不复返了。

标签: windows api service system


【解决方案1】:

在 Vista 及更高版本上,服务在不同的会话 (session 0) 中运行,并且与交互式桌面隔离。这意味着您从服务运行的代码根本无法进行您想要的更改。显而易见的结论是,您需要在交互式桌面上运行代码。

现在您可以做到这一点,但实现起来并不容易。您需要做的是安排您的服务启动在交互式桌面上运行的进程:Launching an interactive process from Windows Service in Windows Vista and later。需要做出改变的是这个过程,而不是服务。

虽然有可能实现您想要的,但我认为您应该将所涉及的困难视为一个信号,以检查您提出的方法是否是解决潜在问题的最佳解决方案。

【讨论】:

  • 感谢您的回复,大卫。我公司的要求是我们可以从系统服务中设置分辨率……就是这样。没有重新评估的余地。是否有任何类型的 COM 调用或命令行调用或任何您能想到的可以完成此任务的方法?
  • 不,正如我在答案中所说的那样。必须在从交互式桌面运行的代码中进行更改。为了使它工作,您将希望您的服务在本地系统帐户下运行。否则在交互式桌面上启动一个进程会涉及可怕的黑客攻击。贵公司的要求可能不切实际。你可以来找点乐子! ;-)
  • 是的,不切实际的要求是我公司的主要内容。我在某处发现了一些东西,我们可以以某种方式从命令行执行 ChangeDisplaySettingsEx ......?我相信调用rundll32 shell32.dll?有任何相关信息吗?
  • @DanielS 如果您的服务这样做,那么它将在附加到服务的桌面上下文中运行。在会话 0 中。这是您看不到的桌面。无论你问我什么问题,我都会简单地重申答案。您需要运行附加到交互式桌面的代码。
  • @DanielS - 答案已经 5 次了。 ;) 如果我再说一遍会有帮助吗?无论您不想听到多少次答案,您都无法在 Windows Vista 及更高版本中做到这一点。 :) +1,大卫 - 在对原始问题发表评论后,我陷入了困境,无法及时回来发布答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2013-11-19
相关资源
最近更新 更多