View Full Version : [C++] Lista Finestre aperte
Ciao raga stò cercando una funzione in C++ che mi restituisca un array con tutti i nomi delle finestre aperte.
ho cercato su msdn ma non trovo quello che fa per me...
*Per finestre aperte intendo anche quelle minimizzate, tutte :)
Grazie:D
te la scrivi da solo: l'enumerazione delle finestre sul desktop corrente non avviene con la restituzione di un array, ma per ogni finestra restituita ti viene chiamata una funzione di callback dalla quale tu puoi ad esempio aggiungere la finestra enumerata ad un tuo array di HWND; tale array lo puoi realizzare con std::vector<HWND> in modo tale da non avere troppi grattacapi.
DanieleC88
30-06-2008, 20:44
http://msdn.microsoft.com/en-us/library/ms633497.aspx
:yeah:
Ho già provato con EnumWindows ma ho qualche problema...
Ho provato il codice:
BOOL EnumWindowsProc(HWND hWnd, long lParam)
{
char Buff[255], NameOfClass[255];
GetWindowText(hWnd, Buff, 254);
GetClassName(hWnd, NameOfClass, 254);
cout << "Window Text: " << Buff << "\t" << "Class Name: "
<< NameOfClass << endl;
return TRUE;
}
#pragma argsused
int main(int argc, char* argv[])
{
EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);
cin.ignore();
return 0;
}
Il problema è che ha una marea di risultati... a me interessavano solo quelle aperte e visibili, per intenderci solo quelle finestre che compaiono sulla barra inferiore nei rettangolini....
Non capisco il funzionamento di queste funzioni "callback"...
sono nooooob :help:
Noob anch'io, comunque dai un'occhiata a IsWindowVisible (http://msdn.microsoft.com/en-us/library/ms633530(VS.85).aspx)
Potresti applicarla come una sorta di filtro nella funzione callback
Altro che noob! SEI UN GENIO!!!
Adesso vedo solo quelli che mi interessano fantastico!
Ho quasi risolto il problema!
L'unico intoppo è che dopo aver girato e trovato le finestre mi dà errore:
"Run-Time Chek Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of a calling function pointer declared with a different calling convention."
(avete presente la finestrella di errore del debug e i tastini "interrompi" "riprova" e "ingora"? quella!)
Il codice è come quello sopra...
non capisco cosa sbaglio....
BOOL EnumWindowsProc(HWND hWnd, long lParam)
{
char Buff[255], NameOfClass[255];
GetWindowText(hWnd, Buff, 254);
GetClassName(hWnd, NameOfClass, 254);
cout << "Window Text: " << Buff << "\t" << "Class Name: "
<< NameOfClass << endl;
return TRUE;
}
#pragma argsused
int main(int argc, char* argv[])
{
EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);
cin.ignore();
return 0;
}
DanieleC88
01-07-2008, 12:27
La documentazione di GetWindowText dice:
nMaxCount
[in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated.
quindi puoi benissimo usare 255 invece di 254. ;)
A vedere dal messaggio di errore, invece, c'è qualcosa che modifica lo stack, ma non vedo dove (sicuro che sia colpa di quella funzione?)... cioè, se è lì, è un buffer overflow su NameOfClass, ma la cosa mi pare strana.
l'aiuto che ti da il compilatore è corretto: hai usato una calling convention sbagliata, tant'è vero che per passare la funzione di callback alla EnumWindows hai dovuto fare un cast.
edit - pardon, un'imperdonabile svista :mc:
l'aiuto te lo da il runtime di Visual C++, non il compilatore :D
@DanieleC88: AUGURIIIIIHH!!!! :yeah: :yeah: :yeah: :yeah:
DanieleC88
01-07-2008, 12:39
hai usato una calling convention sbagliata, tant'è vero che per passare la funzione di callback alla EnumWindows hai dovuto fare un cast.
Uhm, è vero anche questo... stamattina sono un po' stonato, e io a scomodare buffer overflow inesistenti. :doh: :muro:
@DanieleC88: AUGURIIIIIHH!!!! :yeah: :yeah: :yeah: :yeah:
:cincin: :happy: :cincin:
Grazie! :D
lol, non mi ero mai accorto che su Hardware Upgrade la faccina della torta avesse gli occhi! :D :rotfl:
hai usato una calling convention sbagliata, tant'è vero che per passare la funzione di callback alla EnumWindows hai dovuto fare un cast.
ehmmm... riprova a spiegarmi dov'è l'errore un po' più terra terra....:cry:
anzi se mi correggi in un sec il codice sarebbe ancora meglio....
Grazie :D
ehmmm... riprova a spiegarmi dov'è l'errore un po' più terra terra....:cry:
anzi se mi correggi in un sec il codice sarebbe ancora meglio....
Grazie :D
devi inserire la parola "CALLBACK" tra "BOOL" e "EnumWindowsProc", e levare il cast :D
così insomma:
BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam)
{
char Buff[255], NameOfClass[255];
GetWindowText(hWnd, Buff, 254);
GetClassName(hWnd, NameOfClass, 254);
cout << "Window Text: " << Buff << "\t" << "Class Name: "
<< NameOfClass << endl;
return TRUE;
}
#pragma argsused
int main(int argc, char* argv[])
{
EnumWindows(EnumWindowsProc, 0);
cin.ignore();
return 0;
}
Grazie mille per la pazienza! :D
Problema risolto e tutto funzionante! thanks!!! :D :D :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.