[c++/win32]Window zoeken mbv EnumWindows

Pagina: 1
Acties:

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Ik wil een programma aansturen met behulp van window messages. Hiervoor heb ik de hwnd van het window nodig. Ik heb alleen een deel van de caption tot mijn beschikking om het window te vinden.

Ik ben er al achter dat ik de EnumWindows functie moet gebruiken. Helaas lukt het mij niet om deze functie te gebruiken, ik kan geen eenvoudig voorbeeld vinden waarin deze functie wordt gebruikt om door alle windows te lopen. De gevonden voorbeelden zijn ofwel te ingewikkeld, ofwel voor een andere taal dan C/C++.

Ik moet dus door alle windows lopen om de caption te vergelijken met een string. Als ik de juiste window heb gevonden moet ik daar weer doorheen om de juiste knoppen en statics te vinden.

FindWindow kan ik dus niet gebruiken omdat ik geen exacte caption heb.

Heeft er iemand een eenvoudig stukje C of uitleg dat dit demonstreert?

[ Voor 6% gewijzigd door -DarkShadow- op 12-10-2005 15:27 ]

Specialist in:
Soldeerstations
Oscilloscoop


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Je hoeft niet op de caption te zoeken, je kunt ook zoeken op basis van de window class.

In Visual Studio (iig in versie 6 en .NET) zit een tooltje genaamd Spy++. Hiermee kun je door een vizier op het juiste window of control te slepen, erachter komen wat zijn window class is. Deze zal voor de meeste top-level windows uniek zijn.

Zo heet het top-level window van Internet Explorer blijkbaar IEFrame :)

Trouwens, zo moeilijk is het niet om EnumWindows te gebruiken, als je maar weet hoe je een callback-functie moet gebruiken:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Zelfde signature als EnumWindowsProc
BOOL CALLBACK myCallbackFunc(HWND hWnd, LPARAM myParam){
  /* Doe hier iets met hWnd zoals zijn naam opvragen. */

  if(/* Juiste window gevonden */)
    return FALSE;
  else
    return TRUE;
}

int main(int argc, char** argv){
  //Geef myCallbackFunc als function pointer mee
  BOOL bSuccess = EnumWindows(myCallbackFunc, 0x12345678);
  return 0;
}

[ Voor 41% gewijzigd door MrBucket op 12-10-2005 15:41 ]


  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
MrBucket schreef op woensdag 12 oktober 2005 @ 15:33:
Je hoeft niet op de caption te zoeken, je kunt ook zoeken op basis van de window class.
Ik moet het window echt vinden aan de hand van de caption. Het window is alles behalve uniek. De window class is gewoon een dialog.

Nadat ik het window heb gevonden moet ik de child windows (statics, buttons, etc..) zoeken op positie, daarvoor moet ik EnumChildWindows gebruiken, dat werkt hetzelfde als EnumWindows neem ik aan.

Ik moet gewoon weten hoe EnumWindows werkt, er is geen ontkomen aan.

EDIT: Bedankt voor de source, denk dat ik er nu wel uitkom.

[ Voor 6% gewijzigd door -DarkShadow- op 12-10-2005 15:44 ]

Specialist in:
Soldeerstations
Oscilloscoop


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 28-04 14:41

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik moet gewoon weten hoe EnumWindows werkt, er is geen ontkomen aan
Wat is er niet duidelijk aan de documentatie van EnumWindows()?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
.oisyn schreef op woensdag 12 oktober 2005 @ 16:09:
[...]

Wat is er niet duidelijk aan de documentatie van EnumWindows()?
callback :D :D

Specialist in:
Soldeerstations
Oscilloscoop


  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Ik heb mijn code in een klasse staan.

Ik krijg met de code van MrBucket de volgende error:
argument of type `BOOL (tableinterface::)(HWND__*, LPARAM)' does not match `BOOL (*)(HWND__*, LPARAM)'
Ik heb al geprobeerd om op strategische punten de tableinterface:: (tableinterface is de naam van de klasse) in te voegen, maar niks helpt. Beide functies staan in dezelfde klasse en zijn netje gedeclareerd.

Specialist in:
Soldeerstations
Oscilloscoop


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
-DarkShadow- schreef op woensdag 12 oktober 2005 @ 18:47:
Ik heb mijn code in een klasse staan.

Ik krijg met de code van MrBucket de volgende error:
[...]
Ik heb al geprobeerd om op strategische punten de tableinterface:: (tableinterface is de naam van de klasse) in te voegen, maar niks helpt. Beide functies staan in dezelfde klasse en zijn netje gedeclareerd.
Dat komt waarschijnlijk omdat je methode niet statisch is. Windows moet straks jouw callback-methode kunnen aanroepen, alleen nu heeft 'ie geen object om die methode op te kunnen aanroepen. :)

Maar daar is wel een manier omheen:
Declareer je callback-methode in je class als private static, en gebruik het argument wat je mee mag geven om je 'this'-pointer in door te geven. Dus:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
class tableinterface{

  private:
    static BOOL myCallback(HWND hWnd, LPARAM pInstance);
}

BOOL tableinterface::myCallback(HWND hWnd, LPARAM pInstance){
  tableinterface *_this = (tableinterface *)pInstance;
  //Gebruik nu '_this' om je member-variabelen te bereiken
}

//Om je windows te enumeraten (vanuit een niet-statische member van tableinterface) :
BOOL b = EnumWindows(tableinterface::myCallback, (LPARAM)this);


--edit-- Niet zo snel man, ik was nog aan't typen 8)

[ Voor 37% gewijzigd door MrBucket op 12-10-2005 19:02 ]


  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
MrBucket schreef op woensdag 12 oktober 2005 @ 18:56:
Maar daar is wel een manier omheen:
grr... En die is?? :p

Even verbeterd voor de Tweakers met hetzelfde probleem:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
class tableinterface{

  private:
    static BOOL CALLBACK myCallback(HWND hWnd, LPARAM pInstance);
}

BOOL tableinterface::myCallback(HWND hWnd, LPARAM pInstance){
  tableinterface *_this = (tableinterface *)pInstance;
  //Gebruik nu '_this' om je member-variabelen te bereiken
}

//Om je windows te enumeraten (vanuit een niet-statische member van tableinterface) :
BOOL b = EnumWindows(tableinterface::myCallback, (LPARAM)this);

[ Voor 61% gewijzigd door -DarkShadow- op 12-10-2005 19:16 ]

Specialist in:
Soldeerstations
Oscilloscoop


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Vanuit Win64 oogpunt gezien wl je liever geen LPARAM / this casts doen; een static std::map<int,Class*> werkt vaak ook uitstekend.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 16:25

curry684

left part of the evil twins

* curry684 wijst fluitend op [rml]curry684 in "[ Delphi]Opgestarte programma afsluiten"[/rml], simpele hit op [search=enumwindows]...

Professionele website nodig?


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 17:24
MSalters schreef op woensdag 12 oktober 2005 @ 23:01:
Vanuit Win64 oogpunt gezien wl je liever geen LPARAM / this casts doen; een static std::map<int,Class*> werkt vaak ook uitstekend.
Uit interesse, want ik heb geen ervaring met Win64:
-waarom wil je dit liever niet doen?
-bedoel je dan dat je je class aan de map toevoegt, en de int als LPARAM aan je callback functie meegeeft?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 28-04 14:41

.oisyn

Moderator Devschuur®

Demotivational Speaker

MSalters schreef op woensdag 12 oktober 2005 @ 23:01:
Vanuit Win64 oogpunt gezien wl je liever geen LPARAM / this casts doen;
Waarom niet? Een LPARAM is een LONG_PTR, wat in principe groot genoeg is om een pointer in op te slaan. Het is een long op w32 en een __int64 op w64

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
LONG_PTR geworden? Dacht in eerste instantie dat het een __int64 was, en dan heb je gezeur met casts (warnings en zo). Was wel een tijdje geleden dat ik er naar keek. Nou ja, scheelt weer.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1