Entwickler-Ecke

Windows API - Programm bereits geöffnet ???


mambo - Mi 25.09.02 09:33
Titel: Programm bereits geöffnet ???
Hallo !

Ich möchte mit Outlook von Delphi aus ein Mail verschicken. Dazu verwende ich folgende Prozedur:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  Outlook: OutlookApplication;
  NmSpace: NameSpace;
  MI: MailItem;

begin

  Outlook := CoOutlookApplication.Create;
  NmSpace := Outlook.GetNamespace('MAPI');
  NmSpace.Logon('', '', False, False);

  MI := Outlook.CreateItem(olMailItem) as MailItem;
  MI.Recipients.Add('mambo@dnet.it');
  MI.Subject := 'Testmail';
  MI.Body := 'Hallo ! Das ist ein Testmail aus Delphi! ';
  MI.Display(0);
end

So weit so gut.
Doch bevor ich Outlook öffne, möchte ich nachschauen, ob Outlook bereits offen ist, und wenn ja, das Mail von dem bereits geöffneten Outlook aus verschicken.
Wie kann ich das machen ???

Danke inzwischen
(was würde ich bloß ohne Euch machen)

Heinz


Andreas Pfau - Di 01.10.02 09:13

Versuchs mal mit FindWindow. Dazu brauchst Du allerdings den Klassennamnen von Outlook, such mal im Internet danach.

- AP -


DeCodeGuru - Di 01.10.02 09:25

Hallo,

der Klassenname von Outlook ist "rctrl_renwnd32". Wenn du also eine Überprüfung schreiben willst, könnte das so aussehen:


Quelltext
1:
2:
3:
4:
if FindWindow('rctrl_renwnd32',nil) <> 0 then
  ShowMessage('Outlook ist gestartet')
else
  ShowMessage('Outlook ist nicht gestartet');


Der Code müsste eigentlich funktionieren. Achja, FindWindow erwartet als ersten Parameter den Klassennamen und als zweiten den Fenstertitel. Nur zur Erklärung.

@MathiasSimmack: Ich glaube, dass ein Auszug aus der PSDK nicht notwendig ist. :)


JacFab - So 13.10.02 13:00

was ist eigentlich genau der klassenname?


DeCodeGuru - So 13.10.02 13:49

Wenn du bei Delphi ein neues Projekt startest, dann heißt deine Form doch standardmäßig TForm1. So, das ist dann der Klassenname.
Wenn du einen Button namens Button1 hast, dann ist der Name TButton und nicht Button1, außer du hast in deinem Programm eine abgeleitete Klasse erstellt.

Also, der Klassenname ist praktisch der Name der Komponente (z.B.: TButton, TListBox etc.)


JacFab - So 13.10.02 13:56

danke, das war klar und verständlich!


DeCodeGuru - So 13.10.02 15:04

puh, Gott sei dank sonst hätte ich noch mehr ausführen müssen :mrgreen:
:wink:


JacFab - So 13.10.02 16:37

ich habe nun ein neues problem.
ich habe das jetzt mit findwindow gemacht. leider ist da ein nachteil:
wenn das programm zum ersten mal geöffnet wird, zeigt es trotzdem an, dass es schon geöffnet wurde, weil es sich ja selbst erkennt!
ich habe findwindow usw. ins createform ereigniss gesteckt. gibt es irgentein ereigniss, dass ausgelöst wird, bevor windows registriert, dass das programm überhaupt gestartet ist?


DeCodeGuru - So 13.10.02 16:40

frag doch einfach ab, ob das gefundene Handle gleich dem Handle deines Programmes ist. :)


Delete - So 13.10.02 18:02

Ist es ein VCL-Programm, JacFab. Hm, wahrscheinlich ... Also stecke deine Prüfroutine in den DPR-Quelltext (Unit "Windows" nicht vergessen, evtl. noch "Messages", falls du die laufende Instanz aufrufen willst). Auf die Weise prüfst du, bevor dein Formular erzeugt wird!


DeCodeGuru - So 13.10.02 19:05

Hi,

folgenden Code kannst du mal testen(habe ihn nicht getestet):


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
  Instance: THandle;
begin
  Instance := CreateMutex(nil,True,'Project1');
  if GetLastError = Error_Already_Exists then
  begin
    ShowMessage('Programm wurde schon gestartet');
  end
  else
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
    CloseHandle(Instance);
  end;
end.


Achja, Unit Windows und Dialogs müssten eingebunden werden.


Delete - So 13.10.02 19:17

Verbesserungsvorschlag:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if GetLastError = Error_Already_Exists then
  begin
    SendMessage(findwindow('TForm1',nil),WM_SYSCOMMAND,SC_RESTORE,0);
    SetForegroundWindow(findwindow('TForm1',nil));
  end
else
  begin
    ...
  end;

ReleaseMutex(Instance);

Damit kann die Unit "Dialogs" entfallen, stattdessen muss aber "Messages" rein. :)