【发布时间】:2008-09-28 18:33:03
【问题描述】:
这是个主意,我想提供服务?这将寻找某个程序启动并禁止它,除非满足某些条件。
假设我有一个游戏想阻止自己在一周内玩。因此,如果我在周五/周六/周日以外的任何一天启动它,它将拦截并取消。这可以用 C# 实现吗?
我正在寻找的主要是如何捕捉程序启动,休息应该很容易。
【问题讨论】:
这是个主意,我想提供服务?这将寻找某个程序启动并禁止它,除非满足某些条件。
假设我有一个游戏想阻止自己在一周内玩。因此,如果我在周五/周六/周日以外的任何一天启动它,它将拦截并取消。这可以用 C# 实现吗?
我正在寻找的主要是如何捕捉程序启动,休息应该很容易。
【问题讨论】:
好吧,您可以通过查找您想要的进程名称 (GetProcessesByName()) 并杀死它们来确定哪些程序正在运行。
Process[] processes = Process.GetProcessesByName(processName);
foreach(Process process in processes)
{
process.Kill();
}
您可以只列出您不想运行的它们的列表,进行时间检查(或要满足的任何标准),然后遍历列表。我曾经做过一次这样的测试,效果很好。
【讨论】:
我在这里并不特别了解 C#,但您可以通过使用注册表中的图像文件执行选项 (http://blogs.msdn.com/junfeng/archive/2004/04/28/121871.aspx) 来完成此操作(我认为这是一种危险的方式)的一个原因。对于您有兴趣拦截的任何可执行文件,您可以为其设置调试器选项,然后创建一个将在调试器上使用的小型应用程序,然后让它基本上过滤这些调用。如果您想让它运行,请启动该过程,否则做任何您喜欢的事情。我从未尝试过,但它似乎可以做你想做的事。
或者,如果您想对启动的流程做出反应然后将其关闭,您可以使用 ProcessWatcher (http://weblogs.asp.net/whaggard/archive/2006/02/11/438006.aspx) 并订阅流程创建事件,然后在需要时将其关闭。然而,这更像是被动的方法,而不是像第一种方法那样的主动方法。
【讨论】:
我不确定你是否能赶上它的启动,但你可以尝试在窗口列表中查找程序(它是 ENUM_WINDOWS 吗?我不记得了)并在它出现后立即关闭它.
你甚至可以在 AutoIt 中做到这一点!
拖出 Petzold 来玩玩 Windows...
编辑:查看 sysinternals 以获取有关如何列出活动进程的源代码 - 在循环中执行此操作,您可以在程序启动时捕获它。我不认为官方网站仍然有来源,但它一定会在某个地方......
【讨论】:
Hrm,与其拦截它的启动,也许您的服务可能会以某种方式破坏可执行文件(即弄脏权限、重命名 EXE、用责骂您意志薄弱的东西替换 EXE,等等)。
如果这还不够好,您可以尝试以下方法之一:
http://www.codeproject.com/KB/system/win32processusingwmi.aspx
【讨论】:
总是有钩子。尽管 .net 库中不支持它,但您始终可以包装 win32 dll。这是一篇不错的文章:http://msdn.microsoft.com/sv-se/magazine/cc188966(en-us).aspx
这是低级编程,如果您希望代码可移植,我不会使用钩子。
【讨论】:
这个应用程序可以做到这一点Kill Process from Orange Lamp
我不是作者。
【讨论】:
您不一定需要拦截启动程序。您可以编写一个“程序启动管理器”应用程序来为您启动程序(如果它们被列入白名单)。编写应用程序后,您需要做的就是修改应用程序快捷方式,以使用适当的参数指向您的启动管理器。
【讨论】:
如果您只需要禁用应用程序,您可以编辑注册表以尝试自动将调试器附加到该应用程序,如果调试器不存在,Windows 会抱怨并退出。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options] 是关键,查看MS文章http://support.microsoft.com/default.aspx?kbid=238788了解更多信息。
【讨论】: