Ich kenne keinen Registry-Eintrag dafür.
Du muß dafür sorgen, so wie Luckie schreibt, dass dein Programm nur ein mal startet.
Mutex ist hier das Stichwort.
Schlägt das Erstellen des
Mutex fehl, heißt das i.a.R., dass dein Programm bereits läuft.
In diesem Fall mußt du nur dafür sorgen, das der/die Parameter, mit dem dein Programm gerufen wurde, an das bereits laufende Programm gesendet wird.
In einem meiner alten Projekte hab ich das in der *.dpr so in etwa gelöst:
Delphi-Quellcode:
const
cProgrammname = '
Dein Programmname';
// alternativ bevorzuge ich einen GUID (STRG+SHIFT+G in der IDE drücken)
cProgrammName = '
{ACE3F9C0-C0E3-443A-9C04-A3F98F6578F1}';
cFormCaption = '
Dein Fenstertitel';
var
dwMutex : DWORD;
dwMessage : DWORD;
hWindow : DWORD;
cdWork : TcsCopyDataStruct
begin
dwMessage := RegisterWindowMessage(GUID_Message);
dwMutex := CreateMutex(
nil,true,cProgrammname);
if GetLastError <> ERROR_ALREADY_EXISTS
then
begin
Application.Initialize;
Application.CreateForm(TForm, Form1);
Application.Run;
end
else
begin
hWindow := FindWindow(
nil,cFormCaption);
if hWindow <> 0
then
begin
if (paramcount > 0)
and FileExists(paramstr(1))
then
begin
cdWork.dwData := dwMessage;
cdWork.cbData := Length(paramstr(1))+1;
cdWork.lpData := AllocMem(cdWork.cbData);
try
CopyMemory(cdWork.lpData,@paramstr(1)[1],cdWork.cbData-1);
SendMessage(hWindow,WM_COPYDATA,0,lParam(@cdWork));
finally
FreeMem(cdWork.lpData,cdWork.cbData);
end;
end;
end;
end;
if dwMutex <> 0
then
begin
CloseHandle(dwMutex);
end;
Zum Empfangen der Daten hab ich die WinProc der MainForm (Form1) überschrieben. In etwa so:
Delphi-Quellcode:
procedure TForm1.WndProc(var msg: TMessage);
var
dwLen : DWORD;
cdWork : PcsCopyDataStruct;
begin
if msg.Msg = WM_COPYDATA then
begin
cdWork := PcsCopyDataStruct(msg.lParam);
if cdWork.dwData = dwMessage then
begin
// Dein Code ... z.B.
ShowMessage (PChar(cdWork.lpData));
end else
inherited WndProc(msg);
end else
inherited WndProc(msg);
Ich hoffe der Code funktioniert so noch...
Natürlich mut du noch im FormCreate der Form1 auf paramstr(1) prüfen, damit auch das erste Starten des Programms die Parameter berücksichtigt.
Vielleicht hilfts
Edit: Code geändernt!
Hab grade eben erst gemerkt, das die
DP meine spitzen Klammern aus dem Code heraus formatiert.