Ein Programm
-
Deine Überschrift ist absolut nichtssagend. Passender wäre z.B. "Programm nur einmal starten", und unter diesen Stichworten findest du auch massenhaft Threads zum Thema.
Üblicherweise solltest du dort häufiger auf den Hinweis auf http://bcbdev.com/faqs/faq74.htm treffen. Leider scheint die Seite gerade offline zu sein, und um uns diesbezügliches Gejammer zu ersparen hier gleich die archivierte Version:
http://web.archive.org/web/20040218002428/http://bcbdev.com/faqs/faq74.htm
-
Die Überschrift ist wirklich etwas nichtssagend, aber ich glaube, Salim will auf ganz etwas Anderes hinaus. Es geht wohl nicht nur darum, das Programm nur einmal zu starten, sondern in einer MDI-Umgebung die Datei automatisch im laufenden Prozess zu öffnen.
Hätte die Antwort auch in FAQ erwartet, finde hier aber nur die Verknüpfung von Dateien mit der Anwendung und eben die Prüfung, ob das Programm schon läuft. Die Hilfe zu TMDIChild ist im BC5 auch ziemlich nichtssagen (weil nicht vorhanden).
Die Frage würde mich auch brennend interessieren.
-
-
Stimmt - langsam bemerke ich auch dass der Titel wirklich nichtsagend ist, er sagt nur einem was wenn man weiß worum es geht, sry mein Fehler _.
Und ich habe in der FAQ gesucht, auch in der Suche etwas gestöbert aber nicht das gefunden was ich suchte.
Manfred Schmidtke hat mein Problem erfasst
aber ich glaube der Link http://www.bytesandmore.de/rad/cpp/snipp/sc06014.php ist nicht wirklich das was ich suche oder? Ich habs zwar noch nicht ausprobiert, aber ich werds so früh wie möglich machen, hab jetzt leider keine Zeit mehr und muss gehen.
-
Sorry, hatte mich verklickt.
http://www.bytesandmore.de/rad/cpp/snipp/sc06016.phpDass du selbst auf die Ideee kommst, dir auch mal die anderen Einträge dort anzusehen, das wäre ja zuviel erwartet, oder?

-
Salim schrieb:
Ich habs zwar noch nicht ausprobiert, aber ich werds so früh wie möglich machen, hab jetzt leider keine Zeit mehr und muss gehen.
Wie schon erwähnt hatte ich keine Zeit, sonst hätte ich es bestimmt gemacht - also kannst du mich dafür nicht "blamen".

Auf jeden fall großen dank für die Hilfe! Probiers gleich aus
EDIT: HILFE! - jetzt habe ich mich so gefreut und es funktioniert doch nicht :-(. Warum weiß ich nicht.
Anscheinend empfängt mein Programm die Nachricht WM_COPYDATA garnicht - ich schätze mal es liegt daran, dass die gesuchte Form nicht gefunden wurde, also das hWnd falsch gewählt wurde.// Es ist die zweite Instanz. Aktiviere die erste Instanz: HWND hWnd = FindWindow(NULL, "Programm");wobei "Programm" die Caption der MainForm ist, also MainForm->Caption. Also habe ich doch eigentlich alles richtig gemacht, oder? Was ist denn jetzt falsch?
Zum Test habe ich noch folgendes gemacht:SendMessage(hWnd, WM_CLOSE, 0,0);Das klappt nämlich auch nicht, daher gehe ich davon aus dass das hWnd falsch ist.
Wenn ich:// Es ist die zweite Instanz. Aktiviere die erste Instanz: HWND hWnd = FindWindow(NULL, NULL); SendMessage(hWnd, WM_CLOSE, 0,0);Klappt es, irgend ein Fenster aus Windows wird dann nämlich geschlossen *g* (ich weiß, nicht ganz gesund für Windows, aber was tut man nicht alles um fehlerursachen zu finden?).
Also helft mir bitte - ich weiß nicht mehr weiter, warum funzt das nicht? Ich habe sonst alles wie im codesnippet gemacht- woran könnts liegen?
-
Ich hab jetzt statt FindWindow EnumWindows gemacht, und ich glaube dass jetzt das richtige hwnd gefunden wird, jedoch scheint dabei nur SetForegroundWindow und SendMessage(WM_CLOSE) zu funktionieren, andere Befehle will der einfach nicht

Ich habs mit einem andern Programm probiert, wo es auch klappt, aber warum gerade nicht hier? Hat das was mit einer MDI-APP oder sowas zu tun?
-
1. Aendert Dein Programm irgendwo die Caption? Dann suchste naemlich das falsche Windows.
2. Haste ein MessageHandler fuer CopyData?
3. Klappt das nur im Debugger nicht - manchmal findet der Dein Fenster aus der Entwicklungsumgebung!
-
1. Nein, die Caption der Main-Form bleibt immer gleich
2. ja, habe ich
3. nee, daran liegts nicht. Außerdem habe ich dann ja noch später statt FindWindow() EnumWindows() genommen, wodurch ich alle Fenster habe, und an alle Fenster mit der Caption (zum Test) die WM_COPDYDATA verschicke, klappt es nicht! Aber wenn ich es einfach an alle Fenster schicke klappt es!
Also liegt es am "finden" der hWnd. Ich vermute mal, dass das Programm irgendetwas verwechselt, weil wenn ich das anders mache (also die wmcopydatamessage) einfach so durch ein anderes programm verschicke klappt es. vielleicht schickt er die nachricht an sich selbst?
-
Ok es klappt jetzt:
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { char buffer[256]=""; GetWindowText(hwnd, buffer, 256); if(strcmp(buffer, "ProgrammName")!=0) // unbedingt groß und klein schreibung beachten!!! return true; SetForegroundWindow(hwnd); //************************************************ // Kommandozeile nicht leer. Sende die // Kommandozeile an die laufende // Programminstanz in einer WM_COPYDATA Message: if(ParamStr(1).Length() != 0) { COPYDATASTRUCT cds; cds.cbData = ParamStr(1).Length() + 1; cds.lpData = ParamStr(1).c_str(); SendMessage(hwnd, WM_COPYDATA, 0, (LPARAM)&cds); } else return false; return true; } //--------------------------------------------------------------------------- //[...] // Es ist die zweite Instanz. Aktiviere die erste Instanz: EnumDesktopWindows(NULL, EnumWindowsProc, 0); //HWND hWnd = FindWindow(NULL, "Pixelstudio");
-
Hi Salim,
Hab mir mal Deine HomePage angesehen. Dein Graphikprogramm liest/ Speichert Png und Tif- Dateien. Was hast Du da fuer Kompos fuer?
-
PNG durch die PNGImage by Gustavo Daud glaub ich.
Gustavo Huffenbacher Daud
http://pngdelphi.sourceforge.netTiff dateien kommt von Hause Microsoft durch "GDI+".
-
Thx
