【问题标题】:Disable a button for t minutes禁用按钮 t 分钟
【发布时间】:2016-02-18 02:57:31
【问题描述】:

我想禁用一个按钮二十分钟,即使应用程序重新启动,它也应该保持禁用状态。

我想通过读取并存储按下按钮的时间来做到这一点,然后每分钟读取一次系统时间,当经过的时间为 20 分钟或更长时间时,启用按钮。

我认为这可以让我在应用程序重新启动时恢复按下按钮的时间;然后检查经过的时间。

你认为这是个好主意吗? 还有其他选择吗?

【问题讨论】:

  • 如果用户更改了他的系统时间怎么办?系统是否可以访问 Internet 连接以从说 nist 获取网络时间?取决于您希望它有多安全。
  • 用户不能改变他的工作站的时间,它被 gpo 禁用了。是的,系统有互联网连接,所以我可以从 ntp 服务器获取时间。
  • 这样做的目的是什么?用户是好人还是坏人?如果您可以将计算机的访问权限限制为用户,则可以将经过的时间存储在 PC 中。如果没有并且想要足够安全,那么服务器PC的禁用开始时间应该存储在服务器中,然后应用程序应该尝试定期请求服务器再次启用按钮。
  • 你有服务器/数据库吗?
  • 由于电脑有gpo,所以请确保您以安全的方式存储时间,这也可以防止用户通过gpo进行更改。

标签: c# .net winforms


【解决方案1】:

由于您希望此设置在应用程序重新启动时仍然有效,因此除非您涉及外部代理,否则这是不可能的。您可能会尝试的几个选项包括:

  1. http://time.windows.com 或 nist 等读取当前 Internet 时间并将其存储在某处(注册表或本地文件)。在您的应用程序中使用一个计时器,该计时器不断从 Internet 获取最新时间并将其与保存值进行比较。 This post 允许您使用 HTTP 和 TCP 端口 13 读取当前 Internet 时间。

  2. 使用 Windows 计划任务。在某处设置一个布尔标志(再次文件/注册表)并要求计划任务在 20 分钟后清除该标志。 This post 应该可以帮助您创建计划任务。

  3. 创建一个在后台持续运行的 Windows 服务,您可以调用该服务来设置标志以及该标志应保持设置的时间长度。该服务应该运行一个内部计时器(并且不应该依赖系统时间)来跟踪“滴答声”。在指定的时间过去后,服务应该清除他的标志。

【讨论】:

  • 我有一个服务器,我想我可以利用它的时间。
【解决方案2】:

这就是我的想法,

  1. 应用程序启动时,禁用或隐藏按钮
  2. 在禁用/隐藏时设置时间戳并存储在数据库表或文件中。
  3. 现在每分钟或每五分钟读取一次 - 以方便查看是否已过 20 分钟。
  4. 如果 20 分钟已过,请从表或文件中删除条目。

如果应用程序在设置时间戳之前崩溃或重新启动: 1.设置时间戳时,确保表或文件为空。如果没有,请启用计时器 - 时间戳在那里。

【讨论】:

  • 如果应用程序崩溃了,谁能告诉它距离上次崩溃已经过去了多少时间? (记住你不能依赖系统时间)
  • IMO、DateTime.Now 或 DateTime.UtcNow 应该可以正常工作。
【解决方案3】:

如果我是你,我基本上会禁用按钮 然后启动一个定时器,每分钟,程序应该把剩下的时间和当前时间写入一个文件(你也可以解密这个文件,让用户无法更改)

现在当程序重新启动时,它应该读取这个文件,并根据文件中写入的时间启动一个计时器:)

如果您希望计时器在程序关闭时也能正常工作,那么您可以检查一下 (File.GetLastAccessTime)

基本上,您应该将已写入文件的(当前时间)与上次访问时间进行比较,并制作一个函数来获取剩余时间:)

这可能不是一个完美的解决方案,但它会正常工作(我猜)

亲切的问候:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2011-02-04
    • 1970-01-01
    • 2020-06-28
    • 2014-10-21
    相关资源
    最近更新 更多