Entwickler-Ecke
Windows API - Existenz eines WINDOWs abfragen
M. Raab - Mo 06.01.03 15:05
Titel: Existenz eines WINDOWs abfragen
Hallo NG,
ich erzeuge mit folgendem Code ein Fenster:
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
M. Raab - 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 - Mo 06.01.03 17:28
Hallo und noch was:
so initialisiere ich das Fenster:
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
Delete - 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:
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
Quelltext
1:
| SendMessage(aWnd,WM_CLOSE,0,0); |
schließen oder bspw. wieder in den Vordergrund holen:
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 - Di 07.01.03 13:02
Hallo Mathias,
das klappt alles recht gut - Danke.
Gruss
Markus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!