Prüfen, ob bestimmtes Fenster offen (FindWindow ??)
-
Guten Morgen,
ich versuche gerade herauszufinden, ob ein bestimmtes Fenster geöffnet ist. Wenn eine bestimmte Datei (Logfile) mit dem Notepad geöffnet ist, dann will ich eine Messagbox anzeigen lassen, dass man (z.B.) zuerst das Logfile schließen soll.
Meine Frage: Kann man das mit FindWindow realisieren ? Und wie benutzt man diese Funktion überhaupt ? Verstehe die MSDN da nicht ganz. Was müsste da an Argumenten wohin ?
Mein Ansatz ist bis jetzt:
HANDLE hLogWin; hLogWin = FindWindow(NULL, FileName); if (hLogWin != INVALID_HANDLE_VALUE) { ... return; }
Filename beinhaltet den Name meiner Anwendung, "Logfile", das aktuelle Datum und noch nen Counter, also z.B: MeineAnwenung 28.01.2009 1.log
Wäre nicht schlecht, wenn mir da jemand etwas Hilfestellung geben könnte...
Schonmal Thx
-
Und was macht diese Funktion für einen Sinn, wenn ein anderer Benutzer als Editor Notepad++ oder Textpad benutzt?
Was ist Dir unklar an den Argumenten?
-
Kommt da als Classname Notepad hin oder gar nichts ? Und stimmt lpWindowname, wenn ich da mein Filename übergebe ?
Das versteh ich noch nicht.Fakt ist, ich muss einen Weg finden, ob der User das Logfile geöffnet hat oder nicht.
Wenn in der Anwendung auf Start geklickt wird, soll das File geschlossen sein, weil dann da reingeschrieben wird.Das war gerade der einzige Weg, der mir da eingefallen ist.
Vllt kann man ja sonst ne bool-Variable setzen und bei Klick auf Start prüfen, ob die true oder false ist. Dann müsste ich aber auch wieder überlegen, ob man nur ne Meldung anzeigt oder das File (und damit das Window) einfach schließt.
Das ist die Frage...
-
1. Lies die MSDN. Der Classname kann NULL sein, dann wird nur nach dem exakten Titel gesucht!
lpClassName
[in] <SNIP>
If lpClassName is NULL, it finds any window whose title matches the lpWindowName parameter.lpWindowName
[in] Pointer to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match.2. Den Classname für den Notepad kannst Du auch herausbekommen. Benutze Spy++
3. Notepad hält die Datei nicht offen. Notepad schließt die Datei sofort nachdem sie gelesen wurde. Man kann also dennoch hineinschreiben.
4. Nochmal die Frage! Welchen Sinn macht die Suche nach einem Titel wie Notepad, wenn andere Programme wie Notepad++ auch verwendet werden können um solche Textdateien zu lesen?
-
Ok, nach dem exakten Titel suchen hätte auch mehr Sinn.
Stimmt, weil der User ja tatsächlich nen anderen Editor benuten kann.Dann hab ich wieder mal die MSDN nicht aufmerksam gelesen, also kann ich Classname getrost ignorieren (in meinem Beispiel).
zu 2.: Ok, stimmt natürlich, könnte da Spy++ benutzen, aber du hast Recht, das File könnte ja auch mit nem anderen Editor geöffnet werden. Von daher hat sich das ja erledigt.
zu 3.: Das wusste ich noch nicht, also kann ich mir vom Prinzip diese Sache hier sparen, wenn das so ist. Oder ich verwende das, um dem User einen Hinweis anzuzeigen, dass das Logfile noch geöffnet und erst wieder "aktuell" ist, wenn das File nach dem Stoppen des Empfangsvorgangs (COM-Schnittstelle) wieder geöffnet wird.
Da ja wie von dir erwähnt, die Datei gleich nach dem Lesen wieder geschlossen wird.Ok, dann werde ich das so angehen, außer es gibt noch etwas, was ich übersehen hab. Vielen Dank für die Hilfe !!
-
Vernünftige Editoren wie textPad oder NotePad oder Visual-Studio informieren den Anweder, dass sich die datei geändert hat, damit man sie neu einlesen kann.
-
Ok, gut, will mich da aber nicht unbedingt drauf verlassen.
Werde da doch lieber eine eigene Meldung anzeigen die den User darauf hinweist.
Funktioniert alles, nochmals danke für die schnelle Hilfe !!
-
Hi, muss mich nochmal dazu melden.
Wenn der Editor zum Öffnen des Logs verwendet, wird, dann passt es, weil ich dem Filename noch "- Editor" anhänge.Nur wenn eben der Uer z.B. UltraEdit... verwendet, dann gibt die Funktion 0 zurück, was ja logisch ist, da der Titel des Window anders lautet.
Meine Frage: Ist es noch irgendwie möglich, nach einem Fenstertitel zu suchen, in dem mein Filename vorkommt ?
-
mit EnumWindows (google) und strstr (google)
-
Ok, erstmal vielen Dank für deine Antwort !
Funktioniert alles so wie es soll.
Hier nochmal zum Abschluss der Code:BOOL CALLBACK CheckWinTitle(HWND hwnd, LPARAM lParam) { C...View *pView = (C...View*)lParam; char buffer[300]; char *erg; if (hwnd == NULL) return FALSE; if (!IsWindowVisible(hwnd)) return TRUE; SendMessage(hwnd, WM_GETTEXT, sizeof(buffer)/sizeof(char), (LPARAM)buffer); erg = strstr(buffer, pView->WindowTitle); if (erg != NULL) return FALSE; return TRUE; } ... if (!(WNDENUMPROC)EnumWindows(CheckWinTitle, (LPARAM)this)) AfxMessageBox("Die Logdatei ist noch geöffnet.\nSie wird erst wieder nach dem Stoppen des Vorgangs und nach erneutem Öffnen " "aktualisiert.", MB_ICONEXCLAMATION | MB_OK, 0);
Vielen Dank für die Hilfe !!