如何从打开中停止应用程序

时间:2009-08-16 16:23:02

标签: c# .net c++ winapi

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

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

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

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

非常感谢任何帮助。

感谢。

11 个答案:

答案 0 :(得分:11)

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

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

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

REGEDIT4

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

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

答案 1 :(得分:5)

斯蒂芬·纳特(Stephen Nutt)非常出色的回答:

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

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

清洁,美观,轻松。我观察到的唯一副作用是,有时瞬态命令窗口会弹出一个调试器提示,只是暂时消失。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

它被称为诱惑阻挡者,它是available here

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

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

答案 4 :(得分:1)

另一个选项:link 在注册表中的策略下:

  • HKEY_CURRENT_USER 文件夹位于窗口左上角。
  • 双击 Software 下方的 HKEY_CURRENT_USER 文件夹。
  • 双击 Microsoft 文件夹。
  • 双击 Windows 文件夹。
  • 双击 CurrentVersion 文件夹。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

只需更改exe标头中的一些字节,并防止它以这种方式启动。

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

答案 8 :(得分:0)

    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的人,值得努力吗?

答案 9 :(得分:0)

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
        }
    }
}

我在程序中使用它,它运行正常,它应该能够根据您的需要进行更改。

答案 10 :(得分:0)

你可以写一个全局钩子。

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