Einzelnen Beitrag anzeigen

gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Kontextmenü soll mehrere Dateien einen Pragramm schicken

  Alt 10. Apr 2008, 13:42
Ich kenne keinen Registry-Eintrag dafür.

Du muß dafür sorgen, so wie Luckie schreibt, dass dein Programm nur ein mal startet.
Hier im Forum suchenMutex 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.
  Mit Zitat antworten Zitat