EnumWindows

Alles over het toepassen van API en DLL's in Liberty BASIC

Moderator: anthonio

EnumWindows

Berichtdoor glpape » zo mei 13, 2012 8:16 am

Ik heb eens gekeken naar EnumWindows. Een API call waarmee je de handles van vensters ophaalt. EnumWindows gebruikt de callback procedure. Klinkt
indrukwekkend, lijkt ook ingewikkeld als je enumwindows.bas bekijkt in de helpfile bij <callback>. Ik heb enumwindows.bas terug gebracht tot de essentialia, om het beter te kunnen begrijpen. En hoerah!, wat blijkt, en dat is ook de reden dat ik mijn EnumWindows demo op het forum zet, het is eigenlijk redelijk simpel.

De callback procedure is een interactie tussen het besturings systeem en de applicatie. Tussen Windows en je LbtyBAS programma. Interactie is er natuurlijk altijd; bijzonder is dat je er deze keer zelf wat voor moet doen. "EnumWindows" is een API-call die een programma functie als parameter wil. Voor ons dus een Lbty functie die je zelf moet schrijven.

De demo heeft 3 elementen :
1. het Lbty <Callback> commando. Dit specificeert het geheugen-adres van de Lbty functie en de Lbty data-types van de parameters voor deze Lbty functie. Hier de eerste param is een handle, dus As Ulong, de tweede wordt niet gebruikt, hier As Long; de derde (na de haakjes) is de return van de Lbty functie, As Long. Deze info gaat naar de "EnumWindows" API functie, "the calling function".
2. < calldll #user32, "EnumWindows", etcetera >.
3. De Lbty functie, "the callback function". Die functie heet in de MSDN documentatie EnumWindowsProc (voor Process), ik maak ervan ewProc.

En dan gebeurt het volgende: "EnumWindows" geeft, een voor een, de handles van de open vensters door aan de Lbty functie. En zolang de return van de Lbty functie 0 is gaat dit door; het stopt wanneer die return non-zero is. De demo in de helpfile stopt zo bij 5 vensters. Mijn demo stopt bij 25, zo kun je ook je mainwin en je open Lbty Editor in de lijst zien. [de 2 tussenliggende vensters zullen zijn de run-knop en de progress bar].

Je kunt nu met die handle doen wat je wilt. In de demo print ik de titel van de vensters, de naam van de klasse, en de handle zelf.

Code: Selecteer alles
REM  Minimalistische Demo van EnumWindows.
'    Dit is een bewerking van de Demo in de helpfile, onder <callback>.


Callback address, ewProc(ulong, long), long          ' Lbty commando

Calldll #user32, "EnumWindows", address as ulong, 0 as long, rtn as long

wait


Function ewProc(hwnd, lparam)                        ' Lbty functie
   TtleBuffer$  = space$(256)
   ClassBuffer$ = space$(256)
   Calldll #user32, "GetWindowTextA", hwnd as ulong, TtleBuffer$ as ptr, 256 as long, rtn as long
   Calldll #user32, "GetClassNameA", hwnd as ulong, ClassBuffer$ as ptr, 256 as long, rtn as long
     print
     print trim$(TtleBuffer$)
     print trim$(ClassBuffer$)
     print  hwnd
     global i  :  i = i+1                            ' Wel HEEL VEEL simpeler dan de Help file
     ewProc = 1  :  if i = 25 then ewProc = 0        ' 1 makes EnumWindows continue enumeration
End function


En de hele listing is slechts 15 regels.

Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Keer terug naar API/DLL

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron