Newsgroup: it.comp.lang.visual-basic
Titolo: ottenere l'handle di tutto

ciao!
come faccio a ottenere l'handle di tutte le "cose" (qual'e' il termine
appropriato??) nel sistema? non solo le form, ma anche i controlli...
mi serve solo l'elencoin una listbox, null'altro...
grazie
Francesco Mapelli ( 
mape...@tin.it
 )
http://members.xoom.com/Francesco
Mousestats, il contachilometri per il mouse
http://members.xoom.com/mousestats
Sito comune programmatori Visual Basic
http://members.xoom.com/it_lang_vb

...


a funzioni API.
Qui vuoi dire che per ottenere lhwnd di un controllo interno alla mia
applicazione non ho bisogno di API? oppure intendi dire che se voglio
l'handle di un controllo anche esterno alla mia applicazione posso farlo
senza api?

L'API è EnumChildWindow con CallBack.
Un esempio è qui sotto:
'===============================================================
Supponi di avere un Form di nome EDesk con Command1 e List1:
Private Sub Command1_Click()
 Dim hDeskTop As Long
 List1.Clear
 hDeskTop = GetDesktopWindow()
 EnumChildWindows hDeskTop, AddressOf EnumeraFinestreTopLevel, 0     '
Elabora l'Hwnd di TUTTO
End Sub
in un BAS
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long,
ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function EnumDesktopWindows Lib "user32" (ByVal hDeskTop As Long,
ByVal lpfn As Long, ByVal lParam As Long) As Long
Declare Function GetDesktopWindow Lib "user32" () As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal
hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd
As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function GetClassWord Lib "user32" (ByVal hwnd As Long, ByVal nIndex
As Long) As Long
Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As
Long) As Long
Declare Function GetPrivateProfileString Lib "kernel32" Alias
"GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal
lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As
String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileString Lib "kernel32" Alias
"WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal
lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Public Function EnumeraFinestreTopLevel(ByVal hwndTopLevel As Long, lParam
As Long) As Long
    Dim Testo As String, NumCar As Integer
    Dim Class As String, NumClassCar As Integer
' Loop per tutte le finestre attive:
' GetWidowTExt Pone in "Testo" la caption relativa della finestra
' GetClassName Pone in "Class" in nome della Classe
    Testo = Space$(250)
    Class = Space$(250)
    NumCar = GetWindowText(hwndTopLevel, Testo, 250)
    NumClassCar = GetClassName(hwndTopLevel, Class, 250)
    St = ""
    If NumClassCar > 0 Then
       Class = Trim$(Class)
       Class = Mid$(Class, 1, Len(Class) - 1)
       St = Class
       If NumCar > 0 Then
               Testo = Trim$(Testo)
               Testo = Mid$(Testo, 1, Len(Testo) - 1)
               St = St & " - " & Testo
               EDesk.List1.AddItem St
       End If
    End If
    EnumeraFinestreTopLevel = True
End Function
PS:. Questo codice me l'ha postato tempo fa Bruno La Torre.


Per le windows della tua app, puoi usare la collection Controls e prenderne
l'hWnd;
per le windows esterne devi per forza usare le API.
--
Roal Zanazzi
z...@iol.it

senza api?
Intendo dire che l'hwnd dei controlli interni alla tua applicazione si
ottiene tramite la proprietà hwnd, comune a tutti i controlli (tranne quelli
grafici: Image, Shape, Line). Invece se vuoi l'hwnd di un controllo esterno
alla tua applicazione devi usare FindWindow, FindWindowEx o EnumWindows.
Domenico


Anche a me sembra di ricordare così, però forse ricordiamo male tutti e due:
le funzioni che restituiscono un hwnd restituiscono appunto 0 se errore, ma
se il desktop ha hwnd=0 allora in realtà stanno ritornando un hwnd valido,
non un errore. Inoltre, non posso controllare in questo momento, ma mi pare
che esista una funzione GetDesktop che ne restituisce l'handle, e sarebbe
inutile se l'handle del desktop fosse sempre zero.
Domenico

...

Ci avevo pensato anch'io (troppo tardi, pero').
L'hWnd del desktop non e' 0, l'API per averlo e' GetDesktopWindow().
Hai proprio ragione... se mettiamo insieme la nostra memoria, dici che
tiriamo fuori un paio di MB? :-)
--
Roal Zanazzi
z...@iol.it

tiriamo fuori un paio di MB? :-)
Forse sì, ma io contribuirei solo per un paio di Kb :-)
Domenico

 >
Penso che vi sttate confondendo perche' ci sono funzioni tipo GetDC() che se gli passi un HWND=0 ti danno il DC del descktop,
questo non vuol dire che il descktop abbia hwnd=0.
-- 
Hi, Ciao
Ettore                 By -MES-
http://freeweb.aspide.it/freeweb/ilmes
Il sito comune di programmatori VB
http://members.xoom.com/it_lang_vb

 
Non scherziamo ragazzi,
vi ricordate la faccia dei vostri parenti ed amici,
Abbiamo gia' raggiunto qualche Giga!   :-))
e dubito che il cervello implementi algoritmi di compressione  :-))
(magari algoritmi di approssimazione)



Il mio ha un algoritmo wavelet (me l'hanno venduto cosi' :-)
Quindi per un'immagine mi bastano 10-20KB...
Ok, ok, siamo OT, la finisco!
--
Roal Zanazzi
z...@iol.it

Ho utilizzato il programmino per ottenere l'handle di finestre esterne alla
mia app, comparso su questo newsgroup. Esso contiene una istruzione
AddressOf che non viene riconosciuta da VB4.
A cosa serve? Come posso emularla?
Grazie anticipate a tutti
Fabrizio


Acc!
E' una delle novita' di VB5.
Ritorna l'indirizzo (nel senso di puntatore) ad una funzione passata come
parametro.
Non puoi simularla in VB4 (almeno credo), per cui l'esempio che ha postato
Fabio Guerrazzi funziona solo con VB5 o superiore.
--
Roal Zanazzi
z...@iol.it