実現したいこと
起動しているプロセスの内、hWndを持つものだけをリストアップしたい。
hWndと合わせてモジュール名・パス、PIDを取得したい。
終了したものは随時リストから外したい。(決まった動作を行う直前だけ更新でも構わないが、実行時間は短ければ短いほど良い)
Unityを用いて以上のことを実装したい。
試したこと+問題点
モジュール名が簡単に取得できるという観点からSystem.Diagnostics.Process
を使うことにした。
hWnd・モジュール名・パス・PIDを格納できる構造体の配列を作り、GetProcesses()
で取得したものをhWndがあるものだけ格納するプログラムを書いた。
C#
1public class Hoge : MonoBehaviour{ 2 public ActiveApp[] activeApps = new ActiveApp[1000]; 3 [Serializable] 4 public struct ActiveApp { 5 private IntPtr hWnd; 6 public IntPtr HWnd { 7 set { 8 _hWnd = value.ToInt32(); //Unityのインスペクターに表示させたかった。 9 hWnd = value; 10 } 11 get { return hWnd; } 12 } 13 public Process process; 14 public int pID; 15 public string exeName; 16 public string exePath; 17 public int _hWnd; 18 } 19 20 public void ModuleName() { 21 try { 22 Process[] process = Process.GetProcesses(); 23 if (process.Length > activeApps.Length) throw new IndexOutOfRangeException(message: "Apps too much!"); 24 int x = 0; 25 for (int i = 0; i < process.Length; i++) { 26 if (!process[i].HasExited) { 27 if (!(process[i].MainWindowHandle == IntPtr.Zero)) { 28 activeApps[x].exePath = process[i].MainModule.FileName; 29 activeApps[x].exeName = process[i].MainModule.ModuleName; 30 activeApps[x].HWnd = process[i].MainWindowHandle; 31 x++; 32 } 33 } 34 } 35 } 36 catch (Exception e) { 37 UnityEngine.Debug.LogError(e.Message); 38 } 39 } 40} 41
usingは省いてあります。なぜかこのやり方だとhWndの部分が常に0が返されてしまう。
モジュール名等ほかの情報はちゃんと得られました。
Unity Version: 2019.3.13f1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/30 23:26
退会済みユーザー
2020/07/01 01:04