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