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

你想检查天气 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 回答
1

在任何情况下,您都想检测正在运行的 .exe 文件,对吗?在 c# 中,也许这个链接也可以帮助你。

使用 C# .net 检测进程已在 Windows 中运行

检查 Windows 应用程序是否正在运行

于 2012-08-29T05:15:55.893 回答
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

如果要测量该 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

您可以使用以下命令按名称获取正在运行的进程:

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

您可以定期检查,也可以使用前面答案中提到的钩子。如果您在 BF3 之后启动应用程序,则必须在启动期间获取一次进程。

于 2012-08-29T04:59:58.040 回答
0

检查以下链接:

C# 进程终止 - SO Post

如果它正在运行,则杀死一个进程 - 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 回答
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 回答