0

たとえば、バトルフィールド 3 というゲームです。ファイル名は bf3.exe です。最初にゲームを実行したときと、ゲームを終了したときをアプリケーションで検出できるようにしたいと考えています。

私はForm1でやった:

private ProcessStartInfo bf3;

コンストラクターで:

 bf3 = new ProcessStartInfo("bf3.exe");

ProcessStartInfo を使用することが良いアイデアであるかどうか、次に何をすべきかはわかりません。

編集:

これは私のコードです:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using DannyGeneral;


namespace CpuUsage
{
    public partial class Form1 : Form
    {

        private DateTime dt;
        private DateTime dt1;
        private PerformanceCounter theCPUCounter;
        private PerformanceCounter theMemCounter;
        private PerformanceCounter specProcessCPUCounter;
        private float cpuUsage;
        private float memUsage;
        private List<float> Values;

        public Form1()
        {
            InitializeComponent();

            isProcessRunning();

            dt = DateTime.Now;


            Values = new List<float>();
                theCPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
                theMemCounter = new PerformanceCounter("Memory", "Available MBytes");
                specProcessCPUCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);



        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            memUsage = theMemCounter.NextValue();
            label1.Text = memUsage.ToString();
            Logger.Write("Memory Usage   " + memUsage.ToString());
            cpuUsage = this.theCPUCounter.NextValue();
            label2.Text = cpuUsage.ToString();
            Logger.Write("Cpu Usage   " + this.cpuUsage.ToString());
            Values.Add(cpuUsage);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            dt1 = DateTime.Now;
            float Maximum = Values.Max();
            float Minimum = Values.Min();
            float Average = Values.Average();
            string t = string.Format("Maximum --- {0} , Minimum --- {1} , Average --- {2}", Maximum, Minimum, Average);
            Logger.Write(t);

            TimeSpan ts = (dt1 - dt);
            string time = ts.ToString(@"hh\:mm\:ss");
            Logger.Write("Time The Program Was Running ---   " + time);


        }

        private void isProcessRunning()
        {
            while (true) 
            {
                Process[] proclist = Process.GetProcessesByName("bf3.exe");
                if (proclist.Length > 0)
                {
                    Logger.Write("Battlefield 3 Started");
                }
                else
                {
                    Logger.Write("Battlefield 3 Exited");
                }
            } 

        }

    }
}

ここでの問題は、while ループに入り、ループにスタックしたタイマーを決して実行しないことです。タイマーコードも使用する必要があり、同時にbf3.exeが開始または終了したかどうかを確認/待機する必要があります。

4

8 に答える 8

1

いずれにせよ、実行中の.exeファイルを正しく検出したいですか?C#では、このリンクも役立つかもしれません。

プロセスの検出は、C#.netを使用してWindowsですでに実行されています

Windowsアプリケーションが実行されているかどうかを確認する

于 2012-08-29T05:15:55.893 に答える
1

bf3.exe が実行されているか終了しているか、または何を確認したいですか? 次に、次のコードを試してください。

        Process[] _process = null;
        _process = Process.GetProcessesByName("bf3");
        foreach (Process proc in _process)
        {
            proc.Kill();
            MessageBox.Show(proc.ToString());
        }
于 2012-08-29T05:02:35.703 に答える
0

すべてのプロセスを名前で取得してから、長さをチェックする必要があります。

Process[] proc = Process.GetProcessesByName("process_name");
        if (proc.Length > 0) Console.Write("Process is Running");
        else Console.Write("Not running");
于 2016-03-26T09:17:33.560 に答える
0

この msdn 記事に記載されているように、アプリケーションの終了を検出できます。

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/707e9ae1-a53f-4918-8ac4-62a1eddb3c4a/

アプリケーションの開始を確認するには、フックを使用する必要があります。

参照: http://www.codeplex.com/easyhook

お役に立てれば

于 2012-08-29T04:57:54.450 に答える
0

次のコマンドを使用して、実行中のプロセスを名前で取得できます。

Process[] processes = Process.GetProcessesByName("process name");

定期的にチェックするか、前の回答で述べたようにフックを使用できます。BF3 の後にアプリケーションを起動する場合は、起動時に一度プロセスを取得する必要があります。

于 2012-08-29T04:59:58.040 に答える
0

そのEXE実行時間の時間を測定したい場合は、ストップウォッチを使用して、exeを実行する前に開始し、EXEが停止したら停止することができます。

大まかなコードは次のとおりです。

Stopwatch run_time = new Stopwatch();
run_time.Start();

Process.Start("bf3.exe");  //You will need to enter full path here


while(true)
{
            Process[] pListofProcess = Process.GetProcesses();


            bool bRunning = false;

            foreach (Process p in pListofProcess)
            {
                string ProcessName = p.ProcessName;

                ProcessName = ProcessName.ToLower();

                if (ProcessName.CompareTo("bf3.exe") == 0)
                {
                    bRunning = true;
                }

            }
            if (bRunning == false)
            { 
                run_time.Stop();
                //Show elapsed time here.
                break;

            }
          Thread.Sleep(1000);
}
于 2012-08-29T05:30:22.967 に答える
0

以下のリンクを確認してください。

C# プロセスの強制終了 - SO 投稿

実行中のプロセスを強制終了する - dreamin コード

よろしくお願いします

于 2012-08-29T05:02:26.033 に答える
0

次の方法で開始できます。

System.Diagnostics.Process.Start(@"C:\Program Files (x86)\Origin Games\Battlefield 3\bf3.exe"); //modify the start path for wherever your copy is located at

そのexeを実行するとOriginのみが起動し、Webクライアント/サーバーセレクターが起動してゲームが開始されることは確かです.

それを開始するメソッドでは、直後に、「bf3.exe」プロセスが次のように実行されているかどうかを確認する無限ループを実行できます。

while (true) // Run in a separate thread to prevent blocking if that will be a problem
{
Process[] proclist = Process.GetProcessByName("bf3.exe");
if (proclist.Length > 0)
    {
        //BF3 is running, do something here
    }
else
    {
        //BF3 isn't running any more, do something here
    }
}
于 2012-08-29T05:03:18.057 に答える