从Windows服务(Windows 7)更改显示分辨率

从Windows服务(Windows 7)更改显示分辨率,windows,api,service,system,Windows,Api,Service,System,(大家好。我对Windows编程非常陌生,所以如果有人问我这个问题,我只是不知道该搜索什么,我会提前道歉,但这个问题让我发疯,我知道有人可能很容易回答。) 我的公司有一个在Windows7中作为服务运行的应用程序。我的任务是编写代码来更改显示设置,但我显然无法从系统服务中完成这项工作。我创建了一个小的可执行文件,在大约5-10行代码中将颜色深度更改为8bpp,但当我将此代码放入应用程序时,它返回成功,但实际上没有成功(没有任何更改) 在没有掌握Windows编程工作原理的情况下,我尝试了一百万种

(大家好。我对Windows编程非常陌生,所以如果有人问我这个问题,我只是不知道该搜索什么,我会提前道歉,但这个问题让我发疯,我知道有人可能很容易回答。)

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


在没有掌握Windows编程工作原理的情况下,我尝试了一百万种不同的方法使其工作,但都没有成功。有人能帮我找到我需要做什么才能使这个代码正常工作吗?

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

现在你可以做到这一点,但这并不容易实现。您需要做的是安排您的服务启动在交互式桌面上运行的进程:。必须进行更改的是流程,而不是服务


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

您不能。服务运行在不同于Vista及以上版本用户的桌面下,因此无法访问用户的桌面。不过,我在某处找到一篇帖子,说这是可能的。我确实尝试了此操作,但SetThreadDesktop失败,错误代码为0。另外,我被告知Spice桌面代理完成了这一任务,所以这一定是可能的!这篇KB文章的日期是服务与交互式桌面在同一会话中运行的日子,即XP时间。那些日子已经一去不复返了。谢谢你的回复,大卫。我公司的要求是,我们可以从系统服务设置解决方案。。。就这样。没有重新评估的余地。是否有任何COM调用或命令行调用或任何你能想到的能够实现这一点的东西?没有,只是我在回答中所说的。必须在交互式桌面上运行的代码中进行更改。为了使其工作,您将希望您的服务在本地系统帐户下运行。否则,在交互式桌面上启动进程会涉及到可怕的黑客行为。你公司的要求可能不现实。你可以进来找点乐子!;-)是的,不切实际的要求是我公司的一大特色。我在某个地方发现了一些东西,我们可以从命令行执行ChangeDisplaySettingsEx?我想是调用rundll32 shell32.dll吧?有什么信息吗?@DanielS如果您的服务这样做,那么它将在连接到该服务的桌面上下文中运行。在会话0中。这是你看不见的桌面。无论你问我什么问题,我都会简单地重申答案。您需要运行附加到交互式桌面上的代码。@DanielS-现在答案是否定的5次。。)如果我再说一遍会有帮助吗?无论您不想听到多少次答案,Windows Vista及更高版本都无法做到这一点。:)+1,大卫-在对最初的问题发表评论后,我陷入了一些事情,在你之前,我无法及时回来发布答案。