【发布时间】:2017-05-30 09:36:12
【问题描述】:
我有一个用于 Winforms 应用程序的代码。相同的代码也用于 Windows 服务(作为 Windows 服务运行的 exe)。代码抓取 ICON 的句柄。但我发现,在任务管理器(和 GDI 视图)中,当我运行 Winforms 应用程序时,应用程序会显示 GDI 计数。但是当我通过 Windows 服务运行代码时,任务管理器中的服务实例没有显示任何 GDI 计数。那么,这是否意味着 Windows 服务永远无法持有 GDI 句柄?如果是这样,代码是如何工作的,即在句柄上运行的代码实际上是如何在 Windows 服务中工作的。
【问题讨论】:
-
任务管理器无法检索另一个会话中进程的 GDI 计数,因此它显示为零。
-
另一个会话是什么意思?服务也在使用我的凭据运行。
-
Windows 中的每个进程都在特定的“远程桌面会话”中运行,也就是“终端服务会话”,有时只是称为“会话”,尽管这可能是不明确的。请参阅任务管理器中的“会话 ID”列。如果两个不同的用户同时登录,他们处于不同的会话中,您会发现每个用户都可以看到自己进程的 GDI 计数,但看不到其他用户的 GDI 计数。 (在 Windows 10 中,您需要“以管理员身份”运行任务管理器才能查看其他用户的进程。)
-
特别是,所有服务都在会话零中运行。谷歌“会话零隔离”了解更多信息。
-
啊!谢谢,就是这个问题。我编写了一个服务来捕获 GDI 句柄计数,现在我可以看到窗口服务的计数以及两者都在会话 0 中运行。您能否提交答案以便我接受相同的答案。谢谢。
标签: winforms windows-services gdi+ window-handles