2014-11-24 94 views
0

我正在研究掃描我的活動進程的應用程序,並且在選擇之後將關鍵命令傳遞給該進程。我遇到的問題是,並非我所有的流程似乎都有MainWindowTitle。下面是代碼片段,我立即意識到了這個問題:對所有正在運行的進程不顯示進程MainWindowTitle

Dictionary<int, string> procInfo = new Dictionary<int, string>(); 
Process[] processes = Process.GetProcesses(); 
foreach (Process procData in processes) 
{ 
    if (procData.MainWindowTitle.Length > 0)// || procData.ProcessName == "notepad++") 
    { 
     procInfo.Add(procData.Id, procData.ProcessName); 
    } 
} 

foreach (KeyValuePair<int, string> proc in procInfo) 
{ 
    lstProcesses.Items.Add(proc.Value + " (" + proc.Key.ToString() + ")"); 
} 

如果你看一下第5行,你會看到我在那裏迫使記事本++到列表中,以測試對來自WinSpy我的成績++(替代間諜++)並且沒有它拒絕顯示的力量,因爲它的MainWindowTitle屬性是空的。

沒有MainWindowTitle我無法爲應用程序獲取類名稱:

//procID set earlier and shown to be working 
Process proc = Process.GetProcessById(procID); 
string winTitle = proc.MainWindowTitle; 

IntPtr hWnd = proc.MainWindowHandle; 
StringBuilder buffer = new StringBuilder(1024); 
GetClassName(hWnd, buffer, buffer.Capacity); 
string winCaption = buffer.ToString(); 

這樣我就不能定位到應用程序中的關鍵命令傳遞:

//winCaption currently blank, winTitle tested and working 
IntPtr appHandler = FindWindow(winCaption, winTitle); 
SetForegroundWindow(appHandler); 
SendKeys.SendWait("things and junk"); 

我有爲我的項目設置適當的DllImports,所以問題不存在,我還沒有在這裏找到答案或任何可靠的巡航其他互聯網。我是否在代碼中丟失了某些東西,或者這是不好的,我應該感覺不好嗎?

+0

可能的重複[爲什麼Process.MainWindowTitle總是空的除了一個窗口?](http://stackoverflow.com/questions/10063847/why-is-process-mainwindowtitle-always-empty-for-all-但一個窗口) – MethodMan 2014-11-24 20:40:41

+0

我發現答案,雖然這是類似的,但我的問題遍及我的所有進程,而不僅僅是IE。 – 2014-11-24 21:10:15

回答

0

我不得不贊成的P/Invoke的解決方案完全取消上述選項:http://pinvoke.net/default.aspx/user32.EnumDesktopWindows

趁着GetWindowTextGetWindowThreadProcessIDGetClassName在一個新的功能:

//the following was jacked from: http://pinvoke.net/default.aspx/user32.EnumDesktopWindows 
var procCollection = new List<string>(); 
//Dictionary<string, int> procCollection = new Dictionary<string, int>(); 
EnumDelegate filter = delegate(IntPtr hWnd, int lParam) 
{ 
    //return window titles 
    StringBuilder strbTitle = new StringBuilder(255); 
    int nLength = GetWindowText(hWnd, strbTitle, strbTitle.Capacity + 1); 
    string winTitle = strbTitle.ToString(); 

    //return thread process id 
    uint getID = 0; 
    GetWindowThreadProcessId(hWnd, ref getID); 
    int winID = Convert.ToInt32(getID); 

    //return class names 
    StringBuilder strbClass = new StringBuilder(255); 
    GetClassName(hWnd, strbClass, strbClass.Capacity+1); 
    string winClass = strbClass.ToString(); 

    if (IsWindowVisible(hWnd) && string.IsNullOrEmpty(winTitle) == false) 
    { 
     procCollection.Add(winTitle+" -- "+winID+" -- "+winClass); 
    } 
    return true; 
}; 

if (EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero)) 
{ 
    //foreach (KeyValuePair<string, int> procInfo in procCollection) 
    foreach(string procData in procCollection) 
    { 
     //if (procInfo.Key != "Start" && procInfo.Key != "Program Manager") 
     if (procData.Contains("Start") == false && procData.Contains("Program Manager") == false) 
     { 
      lstProcesses.Items.Add(procData); 
     } 
    } 
} 

可以讓我我需要的一切建立我的開放式Windows列表。這並沒有給我像WinSpy ++(Spy ++)這樣的進程列表,但這正是我需要的。

相關問題