今天撰寫了一個windows服務程式,作用是獲取系統正在運行的行程,然后通過行程獲取程式主視窗標題,發現指定的主視窗標題時就關閉該程式。我使用的是以下代碼
Process[] SysProcesses = Process.GetProcesses();,但是卻出現了問題,經過除錯,我發現問題出在Proc.MainWindowTitle上,該服務程式在執行程序中,Proc.MainWindowTitle獲取到的主視窗標題均為空,即使明明存在程式主視窗,仍然無法獲取到,然后我將這段程式插入到正常的桌面程式里,Proc.MainWindowTitle就能夠正常獲取程式主視窗標題,請大神們幫忙解釋一下原因,以及有什么解決辦法,謝謝。
foreach(Process Proc in SysProcesses)
{
if (Proc.MainWindowTitle.Length>0)
{
if(Proc.MainWindowTitle.Contains("Chrome"))
{
try
{
Proc.Kill();
}
catch(Exception error)
{
this.AddTextLine("關閉失敗");
}
}
}
uj5u.com熱心網友回復:
別沉啊。。。。哪位大神幫幫忙。。。uj5u.com熱心網友回復:
自己查閱了多方面的資料,總算是弄明白了。我自己來回答吧,出現無法再服務中獲取主視窗標題的根本原因在于session的不同,從vista以后,windows的服務是運行在session0中,而第一個登錄用戶的應用程式運行在session1中,第二個登錄用戶運行在session2中,以此類推,也就是說windows服務和用戶的應用程式是運行在不同的session中,所以無法獲取到應用程式的主視窗標題。目前還沒有有效的解決辦法,我做了一下變通,將一個程式拆分成兩個程式,將檢測應用程式主視窗標題并關閉應用程式的代碼單獨編譯成一個可執行檔案1.exe,然后在windows服務程式中通過非托管代碼CreateProcessAsUser函式進行session穿透,以固定的時間間隔在當前活動session中啟動1.exe,基本達到了預期目的。
uj5u.com熱心網友回復:
非常感謝您的建議!終于找到了原因,但是我這邊在考慮Session穿透造成的性能問題轉載請註明出處,本文鏈接:https://www.uj5u.com/net/270383.html
標籤:C#
