
如圖,做了個界面無回應的程式,用來測驗。然后我用Windows服務獲取這個程式的運行狀態,如下代碼:
Process[] process = Process.GetProcessesByName("ThreadTest");
bool proType = process[0].Responding;
proType應該回傳false,但一直回傳true,這是什么原因呢?
uj5u.com熱心網友回復:
If the process does not have a MainWindowHandle, this property returns true.uj5u.com熱心網友回復:
session 0隔離導致的先看下Process.Responding的實作
public bool get_Responding()
{
if (!this.haveResponding)
{
IntPtr mainWindowHandle = this.MainWindowHandle;
if (mainWindowHandle == IntPtr.Zero)
{
this.responding = true;
}
else
{
IntPtr ptr2;
this.responding = NativeMethods.SendMessageTimeout(new HandleRef(this, mainWindowHandle), 0, IntPtr.Zero, IntPtr.Zero, 2, 0x1388, out ptr2) != IntPtr.Zero;
}
}
return this.responding;
}
你的服務和那個程式不是運行在同一個會話中,而Process.Responding是通過向目標程式發送一個Windows測驗訊息,5秒內有回應則回傳true,但前提是,要能正確取得目標行程主視窗句柄
有一個很簡單的辦法,掛一個全域鉤子,任務桌面應用(有視窗的)啟動你都會收到通知,有了這個就好辦了,目標程式加載你的鉤子模塊,只需要雙方作一次簡單的通訊,比如全名管道,socket,全域事件(這里指內核事件,不是Net中的普通事件),共享記憶體
uj5u.com熱心網友回復:
無回應是因為后天阻塞了, 狀態還是回應中轉載請註明出處,本文鏈接:https://www.uj5u.com/net/113443.html
標籤:C#
