Avatar billede skovjuul Nybegynder
18. januar 2009 - 16:49 Der er 8 kommentarer og
1 løsning

Give parametre til kørende program

Hola

Jeg har et program som jeg har sørget for kun kan køre en instans af gangen via Mutex.
Dvs. jeg kan markere flere filer af gangen og åbne mit program vha. højreklik-menuen. Disse kan jeg så fange via ParamStr(), men hvordan hvis jeg markere f.eks. 5 nye filer (mens mit program kører) og åbner dem med mit program, hvordan får jeg dem så overført til mit kørende program som parametre så jeg kan fange dem og tilføje dem til en liste af allerede markerede filer?

Håber det er klart nok, ellers så bed om en uddybelse :)
Avatar billede skovjuul Nybegynder
18. januar 2009 - 19:15 #2
Cool nop, den sidste løsning var lige hvad jeg havde brug for (tror jeg). Jeg ved ikke om det på længere sigt kan give problemer når det program der sender "message" er det samme program der skal modtage. Jeg tænker mere på at når FindWindow bliver kaldt om ikke man kan risikere at det er den forkerte version jeg får fat på? Altså ikke den der allerede fandtes men den nye som bare skal sende en message og lukke igen? Når man kigger i Windows Jobliste så kan man se at der kortvarigt er 2 udgaver af programmet.. hvordan kendes der forskel?
Avatar billede nop Nybegynder
18. januar 2009 - 19:27 #3
Der er rigtigt nok et problem med netop at find det rigtige window.
Jeg tror også du bliver nød til at bruge enumwindows(), som er en funktion i windows  API'et til at liste alle åbne windows, når du så har fundet et window med det ønskede navn, så tester du om handlet er det samme som i det program du "står" i, hvis det er så skal du så IKKE sende message, men fortsætte på listen.
Avatar billede nop Nybegynder
18. januar 2009 - 19:31 #4
Du kan faktisk også bare sætte captionen til noget andet, medens du laver findwindow(), det skulle være lige til.
Avatar billede skovjuul Nybegynder
18. januar 2009 - 19:44 #5
Det sidste lyder nemmest, kan du uddybe lidt?
Lige nu har jeg følgende i mit programs opstart:

Program Multicopy;

uses Forms, Windows, Messages, main in 'main.pas';

begin
  if(not AppIsAlreadyRunning(Application.Title)) then //Mutexcontrol-funktion
  begin
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.Createform(TfrmMultiCopy, frmMultiCopy);
    Application.Run;
  end
  else
    SendString; //fra dit link
end.
Avatar billede nop Nybegynder
18. januar 2009 - 19:49 #6
Måske sådan her

procedure sendString;
  temp:=application.caption;
  application.caption:=temp+'.';
  hw:=findwindow(nil,temp);
  application.caption:=temp;

  //lav send til hw

end;
Avatar billede skovjuul Nybegynder
18. januar 2009 - 20:10 #7
Så vidt jeg kan se så operere FindWindow på hovedformens navn og desværre ikke programmets navn. Mit program hedder Multicopy og min forms navn er frmMulticopy (TfrmMulticopy).
Lige nu hedder det: myhandle := FindWindow(nil,PChar('frmMulticopy'));
Hvis jeg skifter det til bare "MultiCopy" så kan den ikke finde programmet.
Avatar billede nop Nybegynder
18. januar 2009 - 20:18 #8
Men så er svaret muligvis som nedenstående, logikken passer; rename selft, find, rename self tilbage.
Du kan evt se her for få hjælp til at finde handle: http://www.swissdelphicenter.ch/torry/showcode.php?id=327

procedure sendString;
var
  temp: string;
  hw: Thandle;
begin

  temp:=frmMulticopy.caption;
  frmMulticopy.caption:=temp+'.';
  hw:=findwindow(nil,temp);
  frmMulticopy.caption:=temp;

  //lav send til hw

end;
Avatar billede skovjuul Nybegynder
18. januar 2009 - 20:35 #9
Hmmm... det ser fint ud, men kan ikke umiddelbart lade sig gøre, da jeg ikke opretter formen mere end én gang. Men så burde jeg teoretisk set heller ikke have et problem :D
Tak for det Nop.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester