我的程序如何判断Delphi是否正在运行?

时间:2009-05-28 17:10:12

标签: delphi

我听说一些自定义组件作者使用RTL例程来检查Delphi是否正在运行以设置共享软件限制。有谁知道这个例程是什么?检查诸如“DelphiRunning”或“IsDelphiRunning”之类的明显名称并没有发现任何有用的东西。

3 个答案:

答案 0 :(得分:18)

这里有 2个不同的想法
- 德尔福正在运行中 - 应用程序在调试器

下运行

测试 Delphi是否正在运行的常用方法是检查是否存在具有特定类名的已知IDE Windows,如TAppBuilder或TPropertyInspector。
这两个版本适用于所有版本的Delphi IIRC。

如果您想知道您的应用程序是否在调试器下运行,即通过IDE“运行”(F9)正常启动或在运行时连接到调试器,您只需要测试DebugHook全局变量 请注意,“从程序中分离”不会删除DebugHook值,但“附加到进程”会设置它。

function IsDelphiRunning: Boolean;
begin
  Result := (FindWindow('TAppBuilder', nil) > 0) and
    (FindWindow('TPropertyInspector', 'Object Inspector') > 0);
end;

function IsOrWasUnderDebugger: Boolean;
begin
  Result := DebugHook <> 0;
end;

如果目标是限制使用您的组件的试用版到应用程序开发时,都有缺陷
- 应用程序中可以包含具有正确类别名称/标题的隐藏窗口 - 可以在代码中手动设置DebugHook

答案 1 :(得分:3)

您可以使用DebugHook&lt;&gt;您的组件代码为0。 DebugHook是一个全局变量(IIRC,它位于系统单元中),由Delphi / RAD Studio IDE设置,无法在其他任何地方设置。

还有其他技术(例如,TAppBuilder的FindWindow()),但是DebugHook将完成所有工作。

答案 2 :(得分:1)

这是www.delphitricks.com/source-code/misc/check_if_delphi_is_running.html的代码段。

function WindowExists(AppWindowName, AppClassName: string): Boolean; 
var 
  hwd: LongWord; 
begin 
  hwd    := 0; 
  hwd    := FindWindow(PChar(AppWindowName), PChar(AppClassName)); 
  Result := False; 
  if not (Hwd = 0) then {window was found if not nil} 
    Result := True; 
end; 

function DelphiLoaded: Boolean; 
begin 
  DelphiLoaded := False; 
  if WindowExists('TPropertyInspector', 'Object Inspector') then 
    if WindowExists('TMenuBuilder', 'Menu Designer') then 
      if WindowExists('TAppBuilder', '(AnyName)') then 
        if WindowExists('TApplication', 'Delphi') then 
          if WindowExists('TAlignPalette', 'Align') then 
            DelphiLoaded := True; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if DelphiLoaded then 
  begin 
    ShowMessage('Delphi is running'); 
  end; 
end; 


function DelphiIsRunning: Boolean; 
begin 
  Result := DebugHook <> 0; 
end;