たくのろじぃのメモ部屋

プログラミング関係や数学などの内容を備忘録として残すブログ。プログラミングはC#を中心に書いています。

【C#】マイクラのプロセス名がMinecraftではなかった話

イクラ自動化をするにあたり、プロセスに干渉して自動操作みたいなことができないかを試したくて、プロセス名を取得してみたら意外な結果を得られました。

実行環境

  • .NET Core 3.1 コンソールアプリケーション
  • Minecraft 1.12.2

1. プロセスの取得

プロセスは簡単に言えば「実行中のプログラム」のことです。メモ帳でもペイントでも、何かしらのアプリを起動していると、それらはシステムによって「プロセス」と認識されます。

イクラ自動化をするにあたり、どうせならプレイヤーの動きも自動化してみたいと思いました。そのためには起動中のプロセスにアクセスしてコマンド、あるいはキー入力をしないといけません。そこで、まずはプロセス名を調べる必要があります。

プロセスを取得するには Process クラスを使用します。このクラスはコンストラクタを持っているので初期化してそのまま使えます。ちなみに、この子は配列で扱います。

イクラのプロセス名は minecraft とかだと思いますが、どんな名前かは分からないので、まずはすべてのプロセスを確認してみます。すべてのプロセスにアクセスするには GetProcesses メソッドを用います。あとは配列の中をみんな大好き foreach でぶん回します。

public static void Processes()
{
    Process[] processes = Process.GetProcesses();
    foreach (var process in processes)
    {
        Console.WriteLine($"{process.Id}:{process.ProcessName}");
    }
}

とりあえずこれでプロセスIDとプロセス名を取得してみます。

f:id:takunology:20200309033643p:plain

あんれぇ~?Minecraft が見つからないですなぁ...。launcherは見つかりましたが、タスクマネージャーを見る限り違うようです。

f:id:takunology:20200309033957p:plain

イクラにはメモリを大量に与えているので、メモリ量で並び替えて探してみると...。

f:id:takunology:20200309034301p:plain

ん? javaw のメモリ使用量がエグいような...???

2. "javaw.exe" は何者なのか?

Javaをベースに動いているのと、メモリ使用量がエグいという点から javaw がマインクラフトのプロセス名なのではと推測しました。プロセス名を指定して詳細情報を得るための方法があります。

プロセス名を指定して情報を得るには GetProcessesByName メソッドを使用します。引数にはプロセス名を入れることでプロパティを参照することができます。配列で宣言する必要がありますが、今回はプロセス名 javaw が1つしかないので配列 [0] を参照します。

メソッドの詳細はドキュメントを参照してみてください。

docs.microsoft.com

public static void GetMinecraftProcess()
{
    //マイクラのプロセス名が "javaw" かもしれないので詳細を得る
    Process[] process = Process.GetProcessesByName("javaw");

    Console.WriteLine($"プロセスID : {process[0].Id}");
    Console.WriteLine($"プロセス名 : {process[0].ProcessName}");
    Console.WriteLine($"ウィンドウタイトル : {process[0].MainWindowTitle}");
    Console.WriteLine($"メインモジュール : {process[0].MainModule}");
    Console.WriteLine($"プロセスの優先順位 : {process[0].BasePriority}");
    Console.WriteLine($"順位の種類 : {process[0].PriorityClass}");
    Console.WriteLine($"メモリ割り当てサイズ : {process[0].PagedMemorySize64}");
    Console.WriteLine($"仮想メモリサイズ : {process[0].VirtualMemorySize64}");
}

3. 結論

まずは実行結果です。

f:id:takunology:20200309035537p:plain

ビンゴ!!
ということで、マインクラフトのプロセス名は javaw でした!

いろいろ気になって java のアプリについて調べてみました。
java はコンソールアプリケーションで使用するための実行ファイルだそうです。また、 javaw はウィンドウアプリケーションで使用するための実行ファイルでした。つまり、マインクラフトは javaw という実行形式で実行されているため、プロセス名が javaw だったと言えます。

4. おわりに

プロセス名 = アプリ名ではなかったことを知れたのは大きな収穫でした。まさか javaw という名前で動いているとは思いませんでした。意外な結果で面白かったです。今回得られたことをマイクラ自動化で活かせると良いと思いました。

参考サイト

参考にさせていただいたサイトです。ありがとうございます。

www.gwtcenter.com

dobon.net