C# 如何覆盖第三方应用程序上的关闭按钮,使其最小化?

C# 如何覆盖第三方应用程序上的关闭按钮,使其最小化?,c#,c++,hook,minimize,C#,C++,Hook,Minimize,我希望覆盖第三方应用程序上的close按钮,以便使应用程序最小化。我没有目标应用程序的源代码 我能用C写这样的东西吗?或者我需要使用C++?< /LI> 我怎么写这种钩子?我需要一个正在运行的进程还是一个驱动程序/dll/服务就足够了 就我所做的研究而言,我认为我必须做类似的事情,但我不知道具体如何: 一个WH_GETMESSAGE钩子,用于覆盖WM_CLOSE,将Windows状态设置为WS_最小化 不要那样做。禁用关闭按钮。提供最小化按钮。 你可以在C++和C++中同时使用。要做到这一点

我希望覆盖第三方应用程序上的close按钮,以便使应用程序最小化。我没有目标应用程序的源代码

  • 我能用C写这样的东西吗?或者我需要使用C++?< /LI>
  • 我怎么写这种钩子?我需要一个正在运行的进程还是一个驱动程序/dll/服务就足够了
就我所做的研究而言,我认为我必须做类似的事情,但我不知道具体如何:

一个WH_GETMESSAGE钩子,用于覆盖WM_CLOSE,将Windows状态设置为WS_最小化


不要那样做。禁用关闭按钮。提供最小化按钮。

你可以在C++和C++中同时使用。要做到这一点,您必须连接到应用程序消息循环中,并将WM_CLOSE消息重写为WM_最小化。要连接到正在运行的任何进程,可以使用:

  • 微软绕道(如果我没记错的话,是商业的,不是免费的)(http://research.microsoft.com/en-us/projects/detours/)

  • EasyHook(LGPL下的开源)(http://easyhook.codeplex.com/)

  • 我使用了EasyHook,我对结果非常满意。它为您提供了非常好的特性,比如启动一个附加了钩子的进程,或者将钩子附加到已经运行的进程。此外,它还为您提供了托管(C#)和本机挂钩库。 我建议您看一下……

    对于C#这可以通过非常简单的方式完成:

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!realClose)
            {
                e.Cancel = true;
                this.WindowState = FormWindowState.Minimized;
            }
        }
    

    其中,
    realClose
    是一个布尔值,当您确实希望关闭应用程序时(例如,不是当用户按下关闭按钮时,而是当用户使用
    file->exit
    或其他类似功能时),您可以将其设置为true。

    @TomWij:请编辑您的问题以提供这些要求。无论是心灵感应者还是其他可能帮助你的人,我们都猜不出你没说什么。它确实对Technical解决方案产生了巨大的影响(尽管正确的(TM)解决方案正如我所写的,并且可能是你投了反对票:“不要这样做”)“对于特定的应用程序”和“钩子”已经是个问题了。不用猜。。。只有你。@TomWij:问题中已经有提示:我和其他能帮助你的人都不是心灵感应者。当你说你不知道确切的答案,但也许一个解决方案可能是“类似于”一个钩子,我们不知道你是否在疯狂地猜测一个可能的解决方案,或者是什么。你试图暗示有关这个问题的一些事情,这让人感到惊讶。直接说出来容易多了。如果你不理解上面的句子,为什么要引用它?只有你。我不同意,这对于你通常想要保留在后台的程序(uTorrent、Thunderbird等)来说是非常方便的-1对于不明确/误导性的问题。OP通过评论澄清了这是关于修改一个他(大概)没有源代码的应用程序的行为。如果我愿意写一个钩子,为什么需要源代码?阿尔夫的评论只是噪音,请忽略它。我同意阿尔夫的观点。OP从未表示他想修改现有的已编译应用程序的行为。一、 我自己,假设他想要代码覆盖关闭按钮,我将建议处理FormClosing事件。“钩住”并不意味着他没有他试图修改的应用程序的代码。他问他可以用C或C++吗?如果他有自己的应用程序,他不会问该使用哪种语言,是吗?此外,他还询问是否需要编写dll或单独的进程。。。拜托,很明显这不是他的申请。即使你认为不清楚,也可以要求OP编辑他的帖子,不要否决投票——这只是粗鲁的行为。现在这很有帮助,令人惊讶的是,有一些为.NET编写的库允许你这么做。所以,如果我理解正确的话:我必须编写一个加载程序,用附加的DLL钩子启动应用程序?是的。您可以编写一个exe,将挂钩dll(托管或非托管)注入目标应用程序并启动它。EasyHook提供了完整的示例帮助您入门:)