从Windows服务获取桌面大小?

deb*_*cey 5 c# windows-services

我正试图从我写的服务中获取Windows桌面的大小(整个而不仅仅是单个屏幕).

在WinForms中 - 标准的C#方法:

SystemInformation.VirtualScreen.Width   
SystemInformation.VirtualScreen.Height
Run Code Online (Sandbox Code Playgroud)

似乎工作(如果您导入Winforms DLL,我想避免) - 但它返回错误的值.桌面大小为2048x768(2个屏幕),但服务报告1024x768(可能只在其中一个屏幕上显示).

检查服务与桌面交互的选项无效.

有什么想法吗?

编辑:

C#发布的解决方案:获取完整的桌面大小?不要在服务内部工作.他们都报告错误的价值.

有趣的是,似乎所报告的值变化并且与实际桌面大小无关(800x600即使该机器上的单个显示器具有更高的分辨率,一些机器也会报告.)

那么 - 还有什么想法吗?删除到注册表和/或命令行是可以的.唯一的限制是我无法启动winforms应用程序来解决它.

sev*_*tov 3

您不能在服务内部执行此操作。服务在会话 0 中运行,其中没有 GDI 函数工作。进程一旦创建,就无法更改会话,也无法在不同会话中使用 UI。

您可能的解决方案之一是在用户会话中启动一个新进程。你可以开始看看这个SO问题。此方法的另一个先决条件是您的服务必须作为本地系统运行,以便您可以启用 SE_TCB_NAME 权限(通过调用 AdjustTokenPrivilegies)。由于您说您已经连接到用户登录通知,因此您应该能够提取您感兴趣的会话的会话 ID。

在用户会话中启动进程后,您必须将新进程的结果传递回服务进程。为此,可以使用任何类型的 IPC 机制。