EnumChildWindows voor alle windows

Status
Niet open voor verdere reacties.

mmatteman

Gebruiker
Lid geworden
3 sep 2008
Berichten
287
Even een korte vraag:
Ik ben nu bezig met enumwindows en enumchildwindows, en probeer als oefening van alle windows alle childwindows d.m.v. cout op het scherm te printen. Ik weet hoe ik enumwindows moet gebruiken, en ook hoe ik enumchildwindows moet gebruiken, maar combineren wil niet lukken. Als voorbeeldwindow heb ik hier iTunes genomen. Hij laat netjes alle vensters zien, en dan daaronder alleen de childwindows van itunes.
[cpp]
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
char buffer[256];
char buffer2[256];
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM LParam)
{
GetWindowText(
hwnd,
buffer,
sizeof(buffer));
cout << "Window name: " << buffer << endl;
return TRUE;
}

BOOL CALLBACK EnumChildProc(HWND hwnd2, LPARAM LParam)
{
GetWindowText(
hwnd2,
buffer2,
sizeof(buffer2));
cout << "Child window: " << buffer2 << endl;
return TRUE;
}


int main()
{
EnumWindows(EnumWindowsProc,0);
HWND hwnd = FindWindow(0, "iTunes");
EnumChildWindows(hwnd, EnumChildProc, 0);
cin.get();
}
[/cpp]

Ik wil de uitkomst van enumwindows, alle vensters dus, combineren met enumchildwindows, die in dit voorbeeld alleen met iTunes werkt. Kan iemand me in de juiste richting wijzen? De oplossing is vast voor de hand liggend, maar ik kom er niet uit :confused:

EDIT: Hij laat trouwens niet alle vensters zien, msn bijvoorbeeld staat er niet tussen en hetzelfde geldt voor firefox. Is daar ook een oplossing voor?
 
Laatst bewerkt:
Moet EnumChildWindows() soms binnen in de EnumWindowsProc()?
Als ik in de main functie EnumChildWindows() aanroep met als HWND de hwnd, dan zegt ie ' hwnd undefined'.
 
Je bent er al bijna uit, EnumChildWindows() moet inderdaad binnen in de EnumWindowsProc().
Let wel op dat je dan EnumChildProc() definieert of declareert voor de definitie van EnumWindowsProc(). Anders krijg je een compiler fout als "`EnumChildProc' undeclared"
 
Laatst bewerkt:
Gelukt! Ik heb nog wat vensters uitgefilterd, zodat je alleen de zichtbare vensters krijgt :thumb:
[cpp]
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
char buffer[MAX_PATH];
char childbuffer[MAX_PATH];
char classbuffer[MAX_PATH];
int windowcounter = 0;
BOOL CALLBACK EnumChildProc(HWND hwnd2, LPARAM LParam)
{
GetWindowText(
hwnd2,
childbuffer,
sizeof(childbuffer));
cout << "--Child window title: " << childbuffer << endl;
return TRUE;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM LParam){
GetClassName(
hwnd,
classbuffer,
sizeof(classbuffer));
string classmatch(classbuffer);
if (classmatch.find("Shell_TrayWnd")!=string::npos)
{
return TRUE;
}
GetWindowText(
hwnd,
buffer,
sizeof(buffer));
string match(buffer);
if (match.find("Program Manager")!= string::npos)
{
return TRUE;
}
if(!IsWindowVisible(hwnd))
{
return TRUE;
}
if(GetWindow(hwnd, GW_OWNER) != NULL)
{
return TRUE;
}
if(match.find("showmeh.exe")!=string::npos)
{
return TRUE;
}
windowcounter++;
cout << "Window #" << windowcounter << " title: " << buffer << endl;
cout << "-Classname: " << classbuffer << endl;
EnumChildWindows(hwnd,EnumChildProc,0);
cout << "__________________________________________________________________" << endl;
cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>|" << endl;
cout << "------------------------------------------------------------------" << endl;
Sleep(200);
return TRUE;
}
int main()
{
while(TRUE)
{
EnumDesktopWindows(NULL,EnumWindowsProc,0);
MessageBeep(0x00000030L);
Sleep(1000);
cout << endl << "Hit ENTER to search again." << endl;
windowcounter = 0;
cin.get();
}
}
[/cpp]
Trouwens hoe zet ik nu de status op 'vraag is opgelost'?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan