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

我的程序如何判断Delphi是否正在运行?,delphi,Delphi,我听说一些自定义组件作者使用RTL例程检查Delphi是否正在运行以设置共享软件限制。有人知道这个程序是什么吗?检查诸如“DelphiRunning”或“IsDelphiRunning”之类的明显名称不会显示任何有用的内容。这是来自的代码片段 函数WindowExists(AppWindowName,AppClassName:string):布尔值; 变量 hwd:长词; 开始 hwd:=0; hwd:=FindWindow(PChar(AppWindowName)、PChar(AppClass

我听说一些自定义组件作者使用RTL例程检查Delphi是否正在运行以设置共享软件限制。有人知道这个程序是什么吗?检查诸如“DelphiRunning”或“IsDelphiRunning”之类的明显名称不会显示任何有用的内容。

这是来自的代码片段

函数WindowExists(AppWindowName,AppClassName:string):布尔值;
变量
hwd:长词;
开始
hwd:=0;
hwd:=FindWindow(PChar(AppWindowName)、PChar(AppClassName));
结果:=假;
如果不是(Hwd=0),则{如果不是nil,则找到窗口}
结果:=真;
结束;
函数:布尔型;
开始
DelphiLoaded:=假;
如果WindowExists('tpPropertyInspector','Object Inspector'),则
如果存在WindowBuilder('TMenuBuilder','Menu Designer'),则
如果WindowBuilder存在('TAppBuilder','(AnyName'),则
如果WindowExists('TApplication','Delphi'),则
如果WindowExists('TAlignPalette','Align'),则
DelphiLoaded:=真;
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
如果是这样的话
开始
ShowMessage(“Delphi正在运行”);
结束;
结束;
函数DelphiIsRunning:布尔值;
开始
结果:=0;
结束;
您可以从组件代码中使用DebugHook 0。DebugHook是一个全局变量(IIRC,在系统单元中),由Delphi/RAD Studio IDE设置,不能从其他任何地方设置


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

这里有两种不同的想法:
-Delphi已启动并正在运行
-应用程序正在调试器下运行

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

如果您想知道您的应用程序是否在调试器下运行,也就是说,在已经运行的情况下,是否正常地从IDE启动并带有“Run”(F9)或连接到调试器,您只需测试DebugHook全局变量。
请注意,“从程序分离”不会删除DebugHook值,但“附加到进程”会设置它

函数IsDelphiRunning:布尔值;
开始
结果:=(FindWindow('TAppBuilder',nil)>0)和
(FindWindow('tpPropertyInspector','Object Inspector')>0);
结束;
函数IsOrWasUnderDebugger:布尔型;
开始
结果:=0;
结束;
如果目标是将组件试用版的使用限制在开发应用程序时,两者都有缺陷:
-应用程序中可以包含具有正确类名/标题的隐藏窗口

-DebugHook可以在代码中手动设置

复制和粘贴。应该清理或忘记此代码段。真的。+1,但是如果出现
-DebugHook怎么办可以在代码中手动设置
简言之,这两个缺陷,有什么解决办法吗?@PresleyDias,然后你开始玩猫捉老鼠的游戏。。。但是要记住的一点是,如果应用程序遇到
DebugBreak
asm int 3 end
并且没有真正的调试器,那么手动设置DebugHook可能会导致应用程序崩溃…哦,好的:P…好的,那么如果它崩溃了应用程序,那么当在IDE中按F9时,它只会报告true。如果在IDE中按Ctrl+Shift+F9,则不会报告为真。@MichaelRiley AKAGunny:当然是真的。Ctrl+Shift+F9在没有调试的情况下运行,这显然不会设置DebugHook。但是如果你没有在调试器的控制下运行,你就没有在IDE中运行,对吗?
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;
function IsDelphiRunning: Boolean;
begin
  Result := (FindWindow('TAppBuilder', nil) > 0) and
    (FindWindow('TPropertyInspector', 'Object Inspector') > 0);
end;

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