【问题标题】:How many times program has run? C#程序运行了多少次? C#
【发布时间】:2009-08-05 15:00:10
【问题描述】:

如何在不保留文件和计数的情况下获取程序先前在 C# 中运行的次数。如果不能这样的话,可以从计划任务管理器中获取吗?

致 C. Ross:如何在注册表设置中完成此操作?对不起。 . .什么是注册表设置?

【问题讨论】:

  • @"什么是注册表设置?" -- 注册表是一个有组织的信息文件,包含给定 Windows 安装的程序和配置数据。 Chesso 在下面提供了一个很好的例子来说明如何与之交互。除非您感到舒服,否则不要在注册表中玩耍,这可能类似于对醒着的人(即非常糟糕)进行脑部手术。
  • @Donta。 Cheeso 有一个很好的答案。我建议使用他们的。

标签: c# count scheduled-tasks execution


【解决方案1】:

我在注册表设置中执行此操作。

static string AppRegyPath = "Software\\Cheeso\\ApplicationName";
static string rvn_Runs = "Runs";

private Microsoft.Win32.RegistryKey _appCuKey;
public Microsoft.Win32.RegistryKey AppCuKey
{
    get
    {
        if (_appCuKey == null)
        {
            _appCuKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(AppRegyPath, true);
            if (_appCuKey == null)
                _appCuKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(AppRegyPath);
        }
        return _appCuKey;
    }
    set { _appCuKey = null; }
}

public int UpdateRunCount()
{
    int x = (Int32)AppCuKey.GetValue(rvn_Runs, 0);
    x++;
    AppCuKey.SetValue(rvn_Runs, x);
    return x;
}

如果它是 WinForms 应用程序,您可以挂钩 Form 的 OnClosing 事件以运行 UpdateCount

【讨论】:

    【解决方案2】:

    据我所知,Windows 不会为您保留这些信息。您必须在某处(文件、数据库、注册表设置)计算值。 Windows 任务计划程序的功能非常低。

    【讨论】:

    • @wally 这听起来并不安全。
    • @C.Ross 我认为您可以更正此“Windows 不会为您保留此信息”。据我所知,它是安全的(如果我错了,请纠正我)。你不是在写注册表,你只是在读它。
    • @wally 我的意思是它不安全,因为它是一个操作系统实现细节(他们甚至 ROT13 它),所以他们可以随意更改它并破坏你的东西。
    • @C.Ross 好的。您仍应删除“Windows 不会为您保留此信息”,因为事实并非如此。
    【解决方案3】:

    应用程序运行的次数存储在注册表中;不过有几点需要注意:

    1. 它存储在 user 注册表中(例如 HKCU)[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist]
    2. 路径存储在 ROT13 中,因此例如 runme.exe 将变为 ehazr.rkr
    3. 注册表实际上以二进制形式存储三个值:最后一次运行时、运行计数(出于某种原因,它从 6 开始而不是 1)以及应用程序的名称。

    不知道这是否有帮助,但你有它!

    【讨论】:

    • 我真的不敢相信,但在 ROT13 中搜索了 devenv.exe(即 qrirai.rkr)后,我确实在 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist] 下发现了一些有趣的条目。
    • 哇,这很奇怪。以这种方式存储它可以完成什么?
    • 如果您正在寻找实现此功能的开源项目,请查看 github.com/JockiHendry/ProgramExecutionCounter。它是用 C# 编写的
    • @chaz 你弄错了。存储这些值的实际上是 Windows。 Windows 会记录您在注册表中打开的每个程序。有人刚刚发现了这一点,并找到了一种解密数据的方法。
    • @Wally 那是相当老的帖子,但看起来我只是将“你”这个词用作不定代词,所以重新措辞应该是“一个人完成了什么用那种方式储存?”很抱歉造成混乱。
    【解决方案4】:

    这里是注册表处理的教程——C# Registry Basics

    【讨论】:

      【解决方案5】:

      您可以简单地创建一个名为 Properties.Settings.Default.TimesRun;application setting

      像这样使用它:

      private void Form1_Load( object sender, EventArgs e )
      {
         Properties.Settings.Default.TimesRun = timesrun++;
         Properties.Settings.Default.Save();
      }
      

      【讨论】:

        【解决方案6】:

        不,任务管理器不提供此类信息。我不会很难创建一个脚本来更新计数,然后执行应用程序,然后设置任务来调用脚本。

        【讨论】:

          【解决方案7】:

          我建议使用 Windows 附带的 ESENT 数据库。使用ESENT Managed Interface 可以轻松获得软件支持。

          【讨论】:

            【解决方案8】:

            @Cheeso,

            您不需要使用该代码的私有成员变量,这是一种稍微精简的方法:

            using Microsoft.Win32;
            public RegistryKey AppCuKey
            {
                get
                {
                    return Registry.CurrentUser.OpenSubKey(AppRegyPath, true)
                        ?? Registry.CurrentUser.CreateSubKey(AppRegyPath);
                }
            }
            

            或者,如果您想更新私有变量,为了避免调用该方法(无论如何,这是一个非常便宜的方法),您仍然可以为自己保存一个 if == null检查。

            【讨论】:

            • 让一个属性返回调用者应该处理的东西是一个非常糟糕的设计。 -1
            • 我使用该属性是因为我在其他地方引用了其他注册表设置。 @erikkallen,我不明白从吸气剂返回 IDisposable 是多么糟糕的设计。不 Dispose() 它可能是糟糕的设计。
            【解决方案9】:
            int x = Your_Project.Properties.Settings.Default.Counter;
            x++;
            Your_Project.Properties.Settings.Default.Counter = x;
            Your_Project.Properties.Settings.Default.Save();
            

            【讨论】:

            • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-04
            • 1970-01-01
            • 2021-11-17
            • 2014-09-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多