ダメ元で探したら、Win32_Processから取れるよ、というヒントを見つけた。
Win32_Processってどう使うんだ? と悩んでいたらここにたどり着きました。
さすがにこれだけでは寂しいので、サンプルコード書いたものを続きを読むの中に置いておきます。上記サイトを参考に組ませて頂きました。
先ほどのサイトと同じようにCommandLineを取得するようにしたら例外発生で落ちる。nullチェックを挟むとOKだったのでnullの事もあるみたい。コンパイル時エラーにはSystem.Managementを参照追加。
ついでにコマンドライン引数でPID与えたらそれのみ表示してくれるようにして組んでみた。
しかし、SQL文で取得してくるなんて使い方知らないと書けない。。
直感的なネーミングではなくて違和感がある。
でもWindowsベッタリなプログラムを久しぶりに弄ったらとても楽しかった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
using System; using System.Collections.Generic; using System.Linq; using System.Management; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Test { class Program { static void Main(string[] args) { ManagementObjectSearcher oMS = new ManagementObjectSearcher(); ManagementObjectCollection oMC; string sMsgStr = ""; oMS.Query.QueryString = "SELECT * FROM Win32_Process"; oMC = oMS.Get(); foreach (ManagementObject oMO in oMC) { if (args.Length == 1) { if (!args[0].Equals(oMO["ProcessId"].ToString())) { continue; } } sMsgStr += oMO["Description"].ToString() + ":" + oMO["ProcessId"].ToString(); if(oMO["CommandLine"] != null){ sMsgStr += ":" + oMO["CommandLine"].ToString(); } sMsgStr += "\n"; } System.Console.WriteLine(sMsgStr); System.Console.ReadKey(); } } } |