Newsgroup: it.comp.lang.visual-basic
Titolo: [API]EnumWindows e EnableWindow

Qualcuno mi sa spiegare perchè il seguente codice funziona come mi aspetto
(blocca tutte le finestre) se faccio click su Command1, ma se uso Command2
invece che riattivarle tutte come dovrebbe fare non ne attiva nessuna?
Proprio non riesco a capire...
'***************NEL MODULO
Global blocca As Boolean
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal
lParam As Long) As Boolean
Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal
fEnable As Long) As Long
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As
Boolean
If blocca = True Then
    EnableWindow hwnd, 0
Else
    EnableWindow hwnd, 1
End If
    EnumWindowsProc = True
End Function
'***********************NEL FORM
Private Sub Command1_Click()
blocca = True
    EnumWindows AddressOf EnumWindowsProc, ByVal 0&
    EnableWindow Me.hwnd, 1
End Sub
Private Sub Command2_Click()
blocca = False
    EnumWindows AddressOf EnumWindowsProc, ByVal 0&
End Sub

Se creo un progetto separato contenente il codice qui sotto e lo eseguo mi
riattiva tutte le finestre..
capisco sempre di meno...
'*******************NEL MODULO
Option Explicit
Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal
fEnable As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal
lParam As Long) As Boolean
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As
Boolean
    EnableWindow hwnd, 1
    EnumWindowsProc = True
End Function
'******************NEL FORM
Private Sub Form_Load()


Ho fatto un'altra prova:
1) eseguo una volta il primo programma e blocco tutte le finestre
2) apro ancora il prima programma (senza terminare l'esecuzione precedente)
3) faccio click su command2 che mi sblocca tutte le finestre.
Sembra che EnumWindows possa essere usato una volta sola per esecuzione, ma
il codice di Command1 dimostra che non č vero.
avete qualche idea della causa del problema e di come risolverlo, dato che č
un po' scomodo aprire due volte lo stesso programma, soprattutto se tutte le
finestre sono inattive.
ah.. la prossima volta faccio tutte le prove possibili prima di postare :-)
ciao


Scusa ma la funzione da te creata EnumWindowsProc cosa dovrebbe fare? 
Abilitare/Disabilitare la finestra di cui passi l'hWnd?
E perchè le passi come handle l'indirizzo di sè stessa? Ciopè perchè fai:
EnumWindowsProc AddressOf EnumWindowsProc, 1
oppure
EnumWindowsProc AddressOf EnumWindowsProc, 0
?
Anzitutto... cosa/chi vuoi bloccare?
-- 
Quando noi ignoranti eravamo di più,
tutto era più bello...
(A. Celentano)

 EnumWindowsProc AddressOf EnumWindowsProc, 0
Hai letto male (hai visto un Proc in più): io ho scritto
EnumWindows AddressOf EnumWindowsProc, ByVal 0&
Non le passo l'handle di se stessa ma passo a una funzione API il suo
indirizzo in memoria. Credo che l'errore non sia qui.
Sicuramente lo sai già ma per evitare equivoci...
EnumWindows è una funzione API che "scorre" tutte le top level window e di
ognuna di queste comunica l'handle a una procedura callback, che ho chiamato
EnumWindowsProc, e che in questo caso contiene anche la riga di codice
EnableWindow hwnd, 0 cioè la chiamata alla funzione API che disabilita la
finestra il cui handle è hwnd (se il secondo parametro è 1 la dovrebbe
attivare).
Quindi se io chiamo EnumWindows, questa dovrebbe passare l'hwnd di ogni top
level window alla procedura callback che a sua volta dovrebbe disabilitare
(se blocca = true) o abilitare (se blocca = false) quella finestra.
La mia domanda era, perchè quando deve bloccare blocca, ma quando deve
sbloccare non fa niente (almeno di visibile)????

 sbloccare non fa niente (almeno di visibile)????
Forse perchè viene bloccata pure la tua finestra quindi non ti veine 
data la possibilità di cliccare sul CommandButton2?


 data la possibilità di cliccare sul CommandButton2?
No, dopo la chiamata per bloccare ho inserito EnableWindow me.hwnd, 1  e
funziona infatti io posso cliccare su command1 e 2 e spostare o ingrandire
il form come voglio e usare la textbox che contiene.

 il form come voglio e usare la textbox che contiene.
Per riabilitare tutte le finestre, devi passargli True, quindi -1.
A parte questo, comunque non viene generato l'evento Click su Command2.
Credo che il problema stia nel VB. Forse andrebbe riabilitato anche 
lui... Provo con il solo eseguibile...


Infatti.
Riabilitando solo il form su cui hai i due commandbutton, non viene 
riabilitata l'intera applicazione. In effetti i click su Command2 
avvengono graficamente ma non viene generato l'evento Command2_Click.
Se invece salvi tutti e crei un'eseguibile, funziona a meraviglia.
Probabilmente il problema sta nel fatto che VB resta dopo il click su 
Command1.
P.S.: Un consiglio: non usare spudoratamente 0 per False e -1 per True. 
Usa un bel CLng(False) o CLng(True).
-- 
Quando noi ignoranti eravamo di piů,
tutto era piů bello...
(A. Celentano)

 Command1.
:\ Intendevo che "... VB resta *disabilitato* ..." :\


Trovato il problema... con CLng(false) funziona perfettamente anche dentro
vb.
Grazie Darkbyte ciao