这是想法,我想提供服务?这将寻找某个程序启动并禁止它,除非满足某些条件。
假设我有一个游戏我想阻止自己在一周内玩。因此,如果我在周五/周六/周日以外的任何一天启动它,它将拦截并取消。这可以用 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
这是低级编程,如果您希望代码可移植,我不会使用钩子。
这个应用程序将执行Orange Lamp 的 Kill Process
我不是作者。
您不一定需要拦截启动程序。您可以编写一个“程序启动管理器”应用程序来为您启动程序(如果它们被列入白名单)。编写应用程序后,您需要做的就是修改应用程序快捷方式以使用适当的参数指向您的启动管理器。
如果您只需要禁用应用程序,您可以编辑注册表以尝试自动将调试器附加到该应用程序,如果调试器不存在,Windows 将抱怨并退出。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options] 是关键,查看 MS 文章http://support.microsoft.com/default.aspx?kbid=238788了解更多信息。