program OneApp;
uses
Windows, Messages, Forms, ShellApi,
uMain
in '
uMain.pas'
{frmMain};
{$R *.res}
procedure Main;
var
i: Integer;
Arg:
String;
Window: HWND;
CopyDataStruct: TCopyDataStruct;
NotifyIconData: TNotifyIconData;
Begin
// try find our window handle by custom classname, kinda bulletproof
Window := FindWindow( SWindowClassName,
nil );
// no old instance found = create a new one
if Window = 0
then
begin
Application.Initialize;
Application.Title := '
OneApp';
// Application.MainFormOnTaskbar := True; // unsupported in Delphi 5
// Application.ShowMainForm := False; // removed, was used while testing
Application.CreateForm( TfrmMain, frmMain );
Application.Run;
end
else
// old instance found! copy any commandline(s) to it
begin
// do we need to copy data?
if ( ParamCount > 0 )
then
begin
FillChar( CopyDataStruct, SizeOf( CopyDataStruct ), 0 );
for i := 1
to ParamCount
do
begin
// ich habe schon verstanden was Du mir sagen wolltest, Du prüfst hier an dieser Stelle nach irgendwas
Arg := ParamStr( i );
CopyDataStruct.cbData := ( Length( Arg ) +1 ) * SizeOf( Char );
CopyDataStruct.lpData := PChar( Arg );
SendMessage( Window, WM_COPYDATA, 0, LPARAM( @CopyDataStruct ) );
end;
end;
// in meinem Beispiel wiederum soll der User den "-visible" switch erst gar nicht kennen
// da wir uns hier in dem "der Prozess existiert" Block befinden
// addiere ich einfach mein "machs Sichtbar" und verarbeite es im Hauptsource
// setup argument to bring window back
Arg := '
-visible';
CopyDataStruct.cbData := ( Length( Arg ) +1 ) * SizeOf( Char );
CopyDataStruct.lpData := PChar( Arg );
SendMessage( Window, WM_COPYDATA, 0, LPARAM( @CopyDataStruct ) );
// Alles was nötig war um ein Fenster aus egal was für einem Status Wiederherzustellen steht hier demarkiert da sich nun der Hauptsource darum kümmert
(*
Switched to above handling method
// Bring old Window back to Foreground in any case
// an dieser Stellte fehlte Deinem Beispiel der ShowWindow() Befehl
// damit wird ein unsichtbares Fenster wieder sichtbar
ShowWindow( Window, SW_SHOW );
SetForegroundWindow( Window );
// try find notification icon by Application.Title and remove it
Window := FindWindow( nil, PChar( Application.Title ) );
if Window <> 0 then
begin
NotifyIconData.cbSize := SizeOf( TNotifyIconData );
NotifyIconData.Wnd := Window;
NotifyIconData.uID := 0;
Shell_NotifyIcon( NIM_DELETE, @NotifyIconData );
end;
*)
end;
End;
Begin
Main;
End.