Namen aller fenster die offen sind!
-
Poste doch mal etwas mehr Code von Deiner CallBack Funktion und deren Aufruf !!!
BTW: Ist Deine Enum-Funktion Global ??? wenn nein dann ist das schon mal auf jeden Fall ein Fehler

MfG veganza
-
BOOL CALLBACK CGetwndowsDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam) { return TRUE; } void CGetwndowsDlg::OnButton1() { ::EnumWindows((WNDENUMPROC)EnumWindowsProc, 0); }wie definiere ich eine funktion global?
-
Laß einfach das CGetwndowsDlg:: weg... so wäre es ja eine Funktion der Klasse

Ich würde es so versuchen : (Deine Proc Funktion ist ja etwas dürftig...)
BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam ) { char WindowText[255]; if ( ::IsWindowVisible(hwnd) && ::IsWindow(hwnd) && ::GetParent(hwnd)==NULL ) { ::GetWindowText( hwnd, WindowText, 255 ); AfxMessageBox(WindowText); } return TRUE; } void CGetwndowsDlg::OnButton1() { EnumWindows( &EnumWindowsProc, NULL); }Um jetzt das Fenster zu schließen mußt Du nur noch eine Suchfunktion anstelle der AfxMessageBox in der CALLBACK Funktion implementieren um in der WindowText Variable Deinen Suchbegriff zu finden. Wenn ein "Treffer" vorliegt mußt Du eigentlich nur noch ein WM_DESTROY o.ä. an das Fenster schicken... Handle zum Fenster ist ja auch vorhanden.
MfG veganza
[ Dieser Beitrag wurde am 12.09.2002 um 22:13 Uhr von veganza editiert. ]
-
schade aber es kommt schonwieder ein Fehler in dieser Zeile:
EnumWindows(&EnumWindowsProc, NULL);
->error C2276: '&' : Ungueltige Operation auf Ausdruck einer gebundenen Member-Funktion
was ist falsch?
hab alles genu so reingepastet in den code wie es oben steht!

-
IMHO: Schon mal daran gedacht Deine MemberFunktion EnumWindowsProc der CGetwndowsDlg-Klasse vorher zu löschen, bevor Du mir den Daumen nach unten zeigst

BTW: Wie lange programmierst Du eigentlich schon ???
MfG veganza
[ Dieser Beitrag wurde am 13.09.2002 um 17:24 Uhr von veganza editiert. ]
-
ich code etwa seit einem Jahr!
so jetzt klappt die funktion super!!! Dankeschön!
Wie kann ich jetzt auf eine variable meiner klasse zugreifen!
so hab ich es versucht kommt aber ASSERT
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { CGetwndowsDlg m_dlg;//variable des dlgs char WindowText[255]; if ( ::IsWindowVisible(hwnd) && ::IsWindow(hwnd) && ::GetParent(hwnd)==NULL ) { ::GetWindowText( hwnd, WindowText, 255 ); m_dlg.m_lol = WindowText;//meine variable bekommt windowtext m_dlg.SetWnds();//funktion wird ausgeführt } return TRUE; } void CGetwndowsDlg::OnButton1() { EnumWindows(&EnumWindowsProc, NULL); } void CGetwndowsDlg::SetWnds() { m_ctlWnd.AddString(m_lol);//die funktion }
-
Wie wäre es wenn Du den this Pointer Deiner Klasse beim EnumWindows Funktionsaufruf mit übergibst !!!
Dann kannst Du in der EnumWindowsProc() Funktion auch auf Deine Dialog Funktionen/Variablen zugreifen !!! Mit Deinem Code legst Du ja nur eine neue Instanz des Dialoges an
Dein Dialog läuft doch aber schon !!!MfG veganza
P.S. Soll ich Dir Deine nächste Frage verraten

-
Ok... wie übergebe ich den this zeiger?
Ich wette du wusstest das diese frage kommt oder???

aber bitte helf mir noch bisschen
-
Mehr sage ich nicht...Aber eigentlich habe ich gehofft, daß nach meinem Tip die Frage vielleicht ausbleibt
denn die 2 Zeilen Source-Code die folgen sollten eigentlich nicht das Problem sein...Ich hole mal etwas aus, damit es für Dich verständlicher wird:
In der MSDN ist zur EnumWindowsProc() Funktion folgendes über den 2. Parameter zu entnehmen.
LPARAM lParam // application-defined value... soll heißen, da können Wir der funktion was mitgeben !!!Also tun wir das auch...
EnumWindows( &EnumWindowsProc, (LPARAM)this );anstelle vom vorher verwendeten NULL im 2. Parameter.
In der EnumWindowsProc() steht ja nun dieser this-Pointer zur Verfügung (Wir übergeben den ja schließlich mit). Um jetzt in der Funktion auf unsere Klasse zugreifen zu können fügen Wir den folgenden Code an den Anfang der EnumWindowsProc() Funktion.
CGetwndowsDlg* pZumDialog = (CGetwndowsDlg*)lParam;und schon kannst Du in der CALLBACK Funktion über pZumDialog-> auf Deine Member Funktionen/Variablen zugreifen.
Hoffe jetzt ist alles klar

MfG veganza
[ Dieser Beitrag wurde am 14.09.2002 um 14:06 Uhr von veganza editiert. ]
-
danke dir aber es klappt nur wenn man:
CGetwndowsDlg* pZumDialog = (CGetwndowsDlg*)lParam;
benutzt!!!
Herzlichen dank sollte in die FAQ !!!
-
Hast natürlich recht... "Schreibfehler" meinerseits... ich korrigiere das mal gleich

MfG veganza
[ Dieser Beitrag wurde am 14.09.2002 um 14:06 Uhr von veganza editiert. ]
-
neue frage! Möchte jetzt variable an meinen Dialog übergeben klappt aber nicht!
char m_wndTxt[255]; if ( ::IsWindowVisible(hwnd) && ::IsWindow(hwnd) && ::GetParent(hwnd)==NULL ) { ::GetWindowText( hwnd, m_wndTxt, 255 ); pZumDialog->WindowText=m_wndTxt;//Fehler: error C2106: '=' : Linker Operand muss ein L-Wert sein }warum kann ich die variable nicht so übergeben?
falls ich das ganze so machen:
if ( ::IsWindowVisible(hwnd) && ::IsWindow(hwnd) && ::GetParent(hwnd)==NULL ) { ::GetWindowText( hwnd, pZumDialog->WindowText, 255 ); }wir immer nur der letzte Fenstername in die variable geschrieben!
Hast du eine idee?

[ Dieser Beitrag wurde am 14.09.2002 um 14:46 Uhr von chris_g editiert. ]
-
jetzt reichts!
=> kick

-
Vorweg:

Dir fehlen elementarste Grundkenntnisse in C/C++ !!! Es wäre hilfreich, wenn du Dir entweder ein Buch oder Tutorials über C/C++ zulegst. Letzt genanntes findest Du u.a. hier.
pZumDialog->WindowText=m_wndTxt;//Fehler: error C2106: '=' : Linker Operand muss ein L-Wert sein
Dein WindowText ist ein char* bzw char[255] habe ich recht ???
Ja habe ich... das ist ja "nur" ein Pointer zu einem Bereich im Speicher und Du kannst keinem Pointer auf diesem Weg einen String (m_wndTxt) zuweisen

2 Lösungsmöglichkeiten:
1. Da wir MFC programmieren würde ich anstelle eines
char WindowText[255] ein CString WindowText benutzen, dann funktioniert Deine Zuweisung.
2. Du behälst Dein char-Array und machst die Zuweisung per strcpy().
wir immer nur der letzte Fenstername in die variable geschrieben!
Hier hast Du ein kleines Verständnis-Problem:
Du gibst mir ja sicherlich recht, daß Wir die EnumWindowsProc() Funktion nur ein einziges mal aufrufen ??? Nach unserem Funktionsaufruf haben Wir alle Fenster "durchlaufen" !!!
Einfach ausgedrückt Deine Variable wird immer wieder mit einem neuen Fensternamen überschrieben... und wenn Sie fertig ist steht halt der letzte Fenstername drin... ganz einfach oder ???Wenn Du z.B. alle Namen "speichern" willst, würde ich Dir ein CString-CArray zum speichern empfehlen, daß kann man schon dynamisch erweitern... da die Fenster-Anzahl ja stark schwanken kann !!!
Wenn ich mich recht erinnere... wolltest Du doch Winamp schließen ??? Wenn Du diese WindowText Variablen-Übergabe nur machst um in der Klasse abzuprüfen ob jetzt Winamp im WindowText auftaucht oder nicht... würde ich diese Überprüfung mit anschließendem WM_DESTROY (Liquidierung der Anwendung) in die EnumWindowProc() Funktion verlagern... Nur so als Tip

Hoffe wie immer, daß es Dir meine Erklärung weiterhilft !!! Sei mir aber nicht böse... das war mein letzter Beitrag zu diesem Thread...
MfG veganza
-
danke veganza!!!
funktioniert jetzt alles! Das einzige was mir gefehlt hat war CStringArray!
Ich bin 14 und mach das nicht beruflich oder so und muss mon auch ziemlich viel für die schule machen!!!
-
hey
ich würde gerne noch was ähnliches wissen
ein teil von meinem prog sieht bis jetzt so aus:
ShellExecute(NULL, "open", "http://eine_seite.de", NULL, NULL, SW_SHOW); Sleep(10000); if (FindWindow(0, "TEILSTRING") != NULL) //falls das fenster offen ist, gehts weiter //else fehlermeldungals teilstring will ich es zb statt *titel-der-seite* - Mozilla Firefox oder *titel-der-seite* - Microsoft Internet Explorer oder wie des heißt,
so haben:if (FindWindow(0, "*titel-der-seite* - XXX") != NULL)
und ob jetzt firefox oder IE oder opera oder was auch immer da drin steht, solls weiter gehnhab schon bissle gesucht manche haben gemeint dass es mit EnumWindows geht. könnt ihr mir bitte helfen??
danke im vorraus