2017-06-22 38 views
0

我正在編寫一個程序,該程序應列出我的過程,當我點擊某個過程時,它應該給我它的描述。我的想法(其實我修改了類似的東西,我發現在網上)是使用ManagementObjectSearcher與SQL語句(「選擇*從Win32_Process WHERE過程ID =」+ a);其中「a」是包含進程ID的字符串變量。對於某些進程的工作(例如chrome,計算器)以及某些進程沒有(svchost,tiltweelmouse等)。c#ManagementObjectSearcher用於查找具有PID的過程(及其描述)

private void Lista_procesa_prikaz_MouseClick(object sender, MouseEventArgs e) 
    { 
     string a = Lista_procesa_prikaz.Items[Lista_procesa_prikaz.FocusedItem.Index].SubItems[1].Text; 
     var searcher = new ManagementObjectSearcher("Select * From Win32_Process WHERE ProcessID="+a); 
     var proces = searcher.Get(); 
     foreach (var process in proces) 
     { 
      var processName = process["Name"]; 
      var processPath = process["ExecutablePath"]; 

      if (processPath != null) 
      { 
       var fileVersionInfo = FileVersionInfo.GetVersionInfo(processPath.ToString()); 
       var processDescription = fileVersionInfo.FileDescription; 
       Description_textbox.Text = processDescription.ToString(); 
      } 
     } 
    } 

,如果有人能發現錯在這裏,我將非常高興, 任何幫助表示讚賞

謝謝

編輯:部分解決問題,如果有人甚至關心,平臺需要進行設置到x64(對我來說)。去項目爲yourprojectname性能構建平臺目標:x64

+1

作爲_guess_我會說那些失敗的特效是以管理員身份運行的。 – Mathemats

+0

@Mathemats嗯,可能,所以我應該怎麼從c#運行我的程序作爲管理員以避免這些錯誤?另外,我嘗試在「if(processPath!= null)」之後添加「else textbox.text = null」,並且即使有時也會彈出錯誤,未處理的異常 –

回答

0

我不知道它是否必須來自ManagementObjectSearcher但我可以建議一個託管類獲取相同的數據。

var procs = System.Diagnostics.Process.GetProcesses() 
    .Where(x => x.Id == 3116); 

foreach(var p in procs) 
    Console.WriteLine(p.ProcessName + p.Id); 

試圖讀取使用這兩種方法的路徑將拋出,如果你沒有提升特權。至於獲得這些權限,請考慮using a manifest