编写windows服务时,mainwindowtitle无法获取存在主窗口的应用程序主窗口标题,请问是什么原因,有没有什么解决办法?

3-_-3 2017-10-31 10:33:24
今天编写了一个windows服务程序,作用是获取系统正在运行的进程,然后通过进程获取程序主窗口标题,发现指定的主窗口标题时就关闭该程序。我使用的是以下代码
Process[] SysProcesses = Process.GetProcesses();
foreach(Process Proc in SysProcesses)
{
if (Proc.MainWindowTitle.Length>0)
{
if(Proc.MainWindowTitle.Contains("Chrome"))
{
try
{
Proc.Kill();
}
catch(Exception error)
{
this.AddTextLine("关闭失败");
}
}
}
,但是却出现了问题,经过调试,我发现问题出在Proc.MainWindowTitle上,该服务程序在执行过程中,Proc.MainWindowTitle获取到的主窗口标题均为空,即使明明存在程序主窗口,仍然无法获取到,然后我将这段程序插入到正常的桌面程序里,Proc.MainWindowTitle就能够正常获取程序主窗口标题,请大神们帮忙解释一下原因,以及有什么解决办法,谢谢。
...全文
489 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
、浅浅笑 2021-03-31
  • 打赏
  • 举报
回复
非常感谢您的建议!终于找到了原因,但是我这边在考虑Session穿透造成的性能问题
3-_-3 2017-11-04
  • 打赏
  • 举报
回复
自己查阅了多方面的资料,总算是弄明白了。 我自己来回答吧,出现无法再服务中获取主窗口标题的根本原因在于session的不同,从vista以后,windows的服务是运行在session0中,而第一个登录用户的应用程序运行在session1中,第二个登录用户运行在session2中,以此类推,也就是说windows服务和用户的应用程序是运行在不同的session中,所以无法获取到应用程序的主窗口标题。目前还没有有效的解决办法,我做了一下变通,将一个程序拆分成两个程序,将检测应用程序主窗口标题并关闭应用程序的代码单独编译成一个可执行文件1.exe,然后在windows服务程序中通过非托管代码CreateProcessAsUser函数进行session穿透,以固定的时间间隔在当前活动session中启动1.exe,基本达到了预期目的。
3-_-3 2017-11-02
  • 打赏
  • 举报
回复
别沉啊。。。。哪位大神帮帮忙。。。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧