【问题标题】:GDI Handles in Windows Service vs Interactive ApplicationWindows 服务与交互式应用程序中的 GDI 句柄
【发布时间】: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


【解决方案1】:

服务实际上能够以与普通应用程序完全相同的方式创建和使用 GDI 句柄,只是显示表面对用户不可见。

但是,任务管理器只能查询运行它的are in the same sessionservices always run in a separate session. 的进程的此信息

所以,基本上,只是虚惊一场。 :-)

【讨论】:

  • 但是,有没有办法查看作为服务启动的应用程序的 GDI 对象?
  • @IspasClaudiu,这很复杂,但简短的回答是否定的。如果您希望显示表面可见,请在用户会话中运行代码,而不是作为服务运行。
猜你喜欢
  • 2011-01-29
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多