Autor Beitrag
M. Raab
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Mo 06.01.03 15:05 
Hallo NG,

ich erzeuge mit folgendem Code ein Fenster:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function WinMain(hInstance : HINST; hPrevInstance : HINST;
                 lpCmdLine : PChar; nCmdShow : Integer) : Integer; stdcall;
var
  msg : TMsg;
  appStart : DWord;
begin
  Finished := False;

  // Das Programm wird initialisiert (Fenster erstellen!)
  if not glCreateWnd(800, 600, FALSE, 32) then
  begin
    Result := 0;
    Exit;
  end;

  appStart := GetTickCount();            // Die Zeit zum Programmstart nehmen

  // Main message loop:
  ....


Das Problem nun ist, dass ich meistens das Fenster wieder killen kann und muss. Soweit funktioniert alles recht gut. Nun kann es aber passieren, dass ich das Fenster neu erzeugen muss und abfragen müsste, ob es bereits existiert. In der SDK habe ich was von findwindow() und der Tatsache gelesen, dass hInstance immer 0 ist und somit zur Abfrage nix taugt. FindWIndow verstehe ich aber nicht !!! Kann mir jemand erklären, wie ich checken kann, ob das Fenster existiert - evtl. mit einem kleinen Code ? :? :? :?

Danke und Gruss

Markus
Ricon
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 06.01.03 15:47 
Hallo M. Raab

ev. hilft dir das weiter:
www.delphi-fundgrube.../faq01.htm#topic0104

Dort wird beschrieben, wie man verhindern kann, dass ein Programm
zweimal geöffnet wird...

Gruss Ricon
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Mo 06.01.03 17:16 
Hallo,

das funzt nicht, da es keinen Anwendungsnamen gibt. Das Problem ist nicht ein Programm 2x zu starten, sondern das in meinem erzeugten Programm gestartete 2. Window (incl. der lfd. Schleife) nicht 2x zu öffnen. In der SDK steht was von findwindow. Dort wird das Problem auch beschrieben und auch die Lösung. Ich verstehe nur die Lösung nicht.

Trotzdem Danke und Gruß

Markus
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Mo 06.01.03 17:28 
Hallo und noch was:

so initialisiere ich das Fenster:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
function glCreateWnd(Width, Height : Integer; Fullscreen : Boolean; PixelDepth : Integer) : Boolean; 
var 
  wndClass : TWndClass;         // Fenster Klasse 
  dwStyle : DWORD;              // Fenster Stil 
  dwExStyle : DWORD;            // Erweiterter Fenster Stil 
  dmScreenSettings : DEVMODE;   // Bildschirm Einstellungen (fullscreen, etc...) 
  PixelFormat : GLuint;         // OpenGL Einstellungen (Pixelformat) 
  h_Instance : HINST;           // aktuelle Instanz 
  pfd : TPIXELFORMATDESCRIPTOR;  // Einstellungen für das OpenGL Fenster 
begin 
  h_Instance := GetModuleHandle(nil);       // Instanz für's Fenster holen 
  ZeroMemory(@wndClass, SizeOf(wndClass));  // Daten in wndClass löschen 

  with wndClass do                    // Setup der Fenster Klasse 
  begin 
    style         := CS_HREDRAW or    // Neuzeichenen wenn Fenster-Breite geändert 
                     CS_VREDRAW or    // Neuzeichenen wenn Fenster-Höhe geändert 
                     CS_OWNDC;        // Device Context exlusiv 
    lpfnWndProc   := @WndProc;        // WndProc wird als Window Procedure gesetzt 
    hInstance     := h_Instance; 
    hCursor       := LoadCursor(0, IDC_ARROW); 
    lpszClassName := 'TEST'; 
  end; 

  if (RegisterClass(wndClass) = 0) then  // Fenster Klasse registrieren 
  begin 
    MessageBox(0, 'Failed to register the window class!', 'Error', MB_OK or MB_ICONERROR); 
    Result := False; 
    Exit 
  end;


Gruss

Markus
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 06.01.03 18:47 
M. Raab hat folgendes geschrieben:
das funzt nicht, da es keinen Anwendungsnamen gibt.

Aber es gibt einen Klassennamen, der -laut deiner Funktion!- "TEST" ist. Demzufolge führt:
ausblenden Quelltext
1:
aWnd := findwindow('TEST',nil);					

zum Ziel. Wenn dein Programm aktiv ist, gibt dir dieser Aufruf das Handle zurück. Du kannst das Fenster dann mit
ausblenden Quelltext
1:
SendMessage(aWnd,WM_CLOSE,0,0);					

schließen oder bspw. wieder in den Vordergrund holen:
ausblenden Quelltext
1:
2:
3:
if not IsWindowVisible(aWnd) then
  SendMessage(aWnd,WM_SYSCOMMAND,SC_RESTORE,0);
SetForegroundWindow(aWnd);

Die Grundidee mit dem Mutex (s. Link) würde ich aber übernehmen, dann weißt du wirklich sicher, dass dein Programm aktiv ist. Es könnte ja auch andere Fenster mit dem Klassennamen "TEST" geben.
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Di 07.01.03 13:02 
Hallo Mathias,

das klappt alles recht gut - Danke.

Gruss


Markus