如何检测代码是否在IDE中运行

4
我有以下函数用于检查代码是否从IDE中运行。令人沮丧的是,有时即使代码是从IDE中运行,该函数也会返回False。而且我不能找到它何时可以正常工作和何时不可用的共同点。有没有想法如何修复此函数或实现其他方法来进行此检查。(我使用该函数在开发期间创建菜单并使测试函数对终端用户不可见)
function IDERunning: Bool;
begin
  Result := (FindWindow('TAppBuilder', nil) > 0) and
    (FindWindow('TPropertyInspector', 'Object Inspector') > 0);
end;

我使用Delphi XE8


出于同样的原因,我使用一个条件定义“DEBUG”,当构建配置为“Debug”时设置它。最终用户只会得到使用“Release”配置构建的版本。 - Tom Brunberg
你应该使用<>而不是>。但无论如何,FindWindow()只告诉你是否存在具有指定类/标题的顶级窗口,但并不告诉你窗口是否实际上与调用进程相关联。如果IDE正在运行,但你的应用程序在IDE外运行怎么办?你上面的代码会认为代码是在IDE中运行,但实际上并不是。此外,FindWindow()仅搜索顶级窗口,如果对象检查器被停靠,则TPropertyInspector窗口不是顶级窗口(当停靠时它实际上有几个层次)。 - Remy Lebeau
@Tom Brunberg - 那个解决方案我之前没想到过。但是既然我现在被告知了,它是我能想到最简单的解决方案。 - OZ8HP
3个回答

15

这取决于你要测试什么:

  • 使用IsDebuggerPresent来测试是否有任何用户模式调试器附加到您的进程。
  • 测试 DebugHook是否非零,以确定程序是否在Delphi IDE调试器下运行。

请注意,当DebugHook为非零时,IsDebuggerPresent将返回true,但反过来不总是成立。除了IDE调试器外,还有其他调试器。


在谷歌上搜索,似乎最好的解决方案应该是 if (DebugHook <> 0) or IsDebuggerPresent then - fantaghirocco
@fant 当前条件为真时,后一个条件就没有意义了。当DebugHook非负时,IsDebuggerPresent始终为True。 - David Heffernan
我想我会先按照Tom Brunberg的建议测试条件定义,然后再转向DebugHook。 - OZ8HP

5

我发现如果关闭工具 > 调试选项 > 集成调试,那么 IsDebuggerPresent 函数返回 false。 - Reversed Engineer

0
对于那些来到这里寻找Visual Studio IDE的检测方法的人, 可以使用System.Diagnostics.Debugger.IsAttached。
    if (System.Diagnostics.Debugger.IsAttached)
    {
        // code for use while in IDE here...
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接