【解決方法】Visual Studio を使用すると Process.mainwindtitle が空の文字列を返す

プログラミングQA

[ad_1]

私はWindows 11を持っています。 VS2019(C#)でコンソールアプリケーションを持っています。
system.Diagnostics.Process を通じて電卓 exe を起動しようとしています。

コードスニペット:

C#
ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Windows\System32\calc.exe");

            //startInfo.RedirectStandardOutput = true;
            startInfo.UseShellExecute = false;
            startInfo.WindowStyle = ProcessWindowStyle.Normal;

            var myProcess = Process.Start(startInfo);

            myProcess.WaitForInputIdle();

            Console.Write("Main window Title : " + myProcess.MainWindowTitle.ToString());

上記のコードを実行すると、電卓 exe が起動されますが、myProcess.MainWindowTitle は空の文字列を返します。 この事実が私には理解できません。 助けてください。

私が試したこと:

MainWidowsTitle の値を取得するために上記のコードを実行してみました。 しかし、電卓が起動しているにもかかわらず、「MainWindowTitle」の値は空の文字列です。

解決策 1

C:\Windows\System32\calc.exe は、別のプロセスを開始する単なるスタブです。 プロセス オブジェクトを見ると、プロセス オブジェクトは終了していることがわかります。

私のWindows 10システムでは、calc.exeは実際に電卓「アプリ」を起動します。
C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.2103.8.0_x64__8wekyb3d8bbwe\Calculator.exe

直接起動することはできません。

解決策 2

問題は、コードの実行とウィンドウのタイトルの呼び出しの間のタイミングに関連している可能性があります。 プロセスがアイドル状態に入った後、タイトルを取得する前に、メイン ウィンドウ ハンドルをチェックする必要があります。

メイン ウィンドウ ハンドルを確認するための「GetMainWindowTitle」というメソッドを追加しました。

C#
using System;
using System.Diagnostics;

class RunandReadMyProgram
{
    static void Main()
    {
        //Create a new process start info...
        ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Windows\System32\calc.exe");

        //Configure your startInfo properties...
        startInfo.UseShellExecute = false;
        startInfo.WindowStyle = ProcessWindowStyle.Normal;

        //Start your processing...
        var myProcess = Process.Start(startInfo);

        //Wait for your process to enter the idle state before reading the title...
        myProcess.WaitForInputIdle();

        //Retrieve the main window title once your process is idle...
        string mainWindowTitle = GetMainWindowTitle(myProcess);

        //Display the main window title where you need it...
        Console.WriteLine("Calculator Window Title: " + mainWindowTitle);
    }

    //The method to get the main window title of your process...
    static string GetMainWindowTitle(Process process)
    {
        string title = string.Empty;

        //Check if your process has a main window handle...
        if (process.MainWindowHandle != IntPtr.Zero)
        {
            //Read the title of the main window...
            title = process.MainWindowTitle;
        }

        return title;
    }
}

[ad_2]

コメント

タイトルとURLをコピーしました