При работе Delphi существует несколько открытых окон, не просто "Delphi". Следовательно, ваше приложение должно проверять больше одного окна, чтобы сделать имитацию работы Delphi очень трудной. Для примера:
function DelphiIsRunning : boolean;
var
H1, H2, H3, H4 : Hwnd;
const
A1 : array[0..12] of char = 'TApplication'#0;
A2 : array[0..15] of char = 'TAlignPalette'#0;
A3 : array[0..18] of char = 'TPropertyInspector'#0;
A4 : array[0..11] of char = 'TAppBuilder'#0;
T1 : array[0..6] of char = 'Delphi'#0;
begin
H1 := FindWindow(A1, T1); H2 := FindWindow(A2, nil); H3 := FindWindow(A3, nil); H4 := FindWindow(A4, nil); Result := (H1 <> 0) and (H2 <> 0) and (H3 <> 0) and (H4 <> 0); end; initialization if not DelphiIsRunning then begin AboutBox := TAboutBox.Create(nil); AboutBox.ShowModal; AboutBox.Free; Halt; end; end. |
Самая большая каверза, которую я обнаружил в данном методе, заключается в том, что когда вы запускаете программу с данным кодом, она работает из-под Delphi (что, в прочем, нам необходимо), но она будет работать и в том случае, когда программа запущена не из-под Delphi, а Delphi также загружена и работает параллельно. [000748]