如何停止打开应用程序

我想写一个小应用程序,它位于我的托盘中,允许我选择一个可执行文件并阻止它打开。

使用WinForms可以轻松完成应用程序的UI。

我想知道的是如何检测某个exe是否已经被激活,然后如何阻止它运行。 我很确定我将不得不深入研究一些Win32的东西,但我没有这方面的经验,因此这篇文章。

有一个类似于此的现有应用程序,但我不能为我的生活记住它的名字。 它是用VB6编写的,它也是开源的。

任何帮助深表感谢。

谢谢。

而不是试图在它运行时杀死进程,如何阻止它在第一时间运行?

更改shell尝试启动应用程序时发生的情况很简单 – 将新注册表项添加到HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File Execution Options

为了测试这个,我添加了一个名为notepad.exe的注册表项,其中包含值为calc.exe的字符串值Debugger 。 现在每当我尝试运行记事本时,calc就会打开。 以下是导出的注册表项。

REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe] "Debugger"="calc.exe" 

做了这个改变之后我还没有设法打开记事本,对于无代码解决方案来说也不错。 如果您需要100%确定应用程序永远不会运行,您可以随时添加“kill”解决方案,如其他人详细说明的那样。

斯蒂芬纳特的另一个很好的答案只是一小部分:

如果你想让程序永远消失,不要只是弹出其他东西(Stephen的例子中的calc.exe)。 指定密钥:“Debugger”=“ntsd -cq”

这将使用命令行参数-c调用“执行下一个指定的调试器命令”来调用NT用于程序的NT命令行调试器ntsd ; 调试器命令是q (意味着退出)。 这将停止调试器,作为副作用将终止调试对象 – 您想要阻止运行的程序 – 也是如此。

干净,漂亮,容易。 我观察到的唯一副作用是,有时瞬态命令窗口会弹出一个调试器提示,只是暂时消失。

Windows挂钩应该可以解决您的问题。 我从来没有尝试过这个…但你必须对Win32 API做一些pinvoke来实现这一点。 谷歌Win32挂钩,看看。

好的,我刚刚找到了我原本想要的应用程序。

它被称为Temptation Blocker,它可以在这里找到

它将找到所有可执行文件,并允许您选择阻止多少小时的内容。

这不是完美的,我希望它会自动启动所以我不必手动启动它但除此之外它还不错

我记得一些Win32function,它有助于解决这些问题。 如果你正在使用.Net,那可能会很难实现。 我会使用一些跨进程同步对象(不知道哪些是跨进程的)并且会设置一些信号。 在启动时,让您的应用程序检查信号是否已设置。 如果是,请再次关闭应用程序。

其中一个想法,但不是最好的是观察正在运行的进程并在找到时终止所需的运行进程,这可以使用普通的托管C#代码完成。

而不是等待可执行文件打开,所以你可以再次关闭它,你也可以削弱可执行文件。

只需更改exe标头中的一些字节,并防止它从那里开始。

只是以效果可逆的方式做到这一点。

  private bool KillProcess(string name) { foreach (Process clsProcess in Process.GetProcesses()) { if (clsProcess.ProcessName.ToLower().StartsWith(name.ToLower())) { clsProcess.Kill(); return true; } } return false; } 

是的,这是我到目前为止使用的方法。 这将在应用程序打开后关闭它,这样我就可以获得大约90%的应用程序。 我使用一个每10秒检查一次的计时器。 我只是想知道是否值得花时间研究Windows钩子(我一无所知)以方便即时应用程序阻止。 那些了解Win32 api的人,值得努力吗?

 internal static class Program { private static Mutex m; [STAThread] private static void Main() { bool flag; m = new Mutex(true, "ProgramName", out flag); if (!flag) { MessageBox.Show("Another instance is already running."); } else { //start program } } } 

我在一个程序中使用它,它运行得很好,它应该能够根据您的需要进行更改。

你可以写一个全局钩子。

将被挂钩的内容不如它是全局的事实重要,因此,在一个单独的DLL中实现。 在该库中,您可以正确处理附加到新模块的操作。 如果您检测到进程重复 – 请将其删除。