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