Salve, ho bisogno di aiuto. Sto sviluppando un software che, tra le varie funzioni, dovrebbe consentire di decriptare gli asterischi utilizzati per nascondere le password. In particolare, il programma dovrebbe essere in grado di tradurre in caratteri normali gli asterischi di tutte le password visibili sullo schermo.

Il perché di questa funzione è presto detto: a chi, come il sottoscritto, capita di salvare la password di accesso a Internet per non doverla riscrivere a ogni collegamento viene da chiedersi cosa succederebbe se, a un certo punto, la si dimenticasse. Basterebbe deselezionare la casella "Salva Password" per far sparire definitivamente gli asterischi e perdere la possibilità di collegarsi. Da qui è nata la necessità di sviluppare una funzione che fosse di aiuto in questo senso.

La funzione di cui sopra si ottiene inserendo il seguente codice in un modulo:

codice:
Option Explicit

Public Declare Function EnumChildWindows Lib "User32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function EnumWindows Lib "User32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
Public Declare Function ShowWindow Lib "User32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Public Const EM_GETPASSWORDCHAR = &HD2
Public Const EM_SETPASSWORDCHAR = &HCC
Public Const EM_SETMODIFY = &HB9
Public Const SW_HIDE = 0
Public Const SW_SHOW = 5

Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
  EnumChildWindows hwnd, AddressOf EnumWindowsProc2, 1
  EnumWindowsProc = True
End Function

Public Function EnumWindowsProc2(ByVal hwnd As Long, ByVal lParam As Long) As Long
  If SendMessage(hwnd, EM_GETPASSWORDCHAR, 0, 1) Then
   UpdateWindow hwnd
  End If
  EnumWindowsProc2 = True
End Function

Public Sub UpdateWindow(hwnd As Long)
  SendMessage hwnd, EM_SETPASSWORDCHAR, 0, 1
  SendMessage hwnd, EM_SETMODIFY, True, 1
  ShowWindow hwnd, SW_HIDE
  ShowWindow hwnd, SW_SHOW
End Sub

Public Function UnmaskPasswords()
  EnumWindows AddressOf EnumWindowsProc, 1
End Function
edit by xegallo: usa i tag

Questa funzione sembra funzionare perfettamente sotto Windows 95, 98 e Millennium. Per "smascherare" tutti gli asterischi presenti sullo schermo (anche appartenenti ad applicativi diversi), è sufficiente richiamare UnmaskPasswords.

Il problema sorge quando si utilizza il programma sotto Windows XP, dal momento che i caratteri usati per celare le password non sono i classici asterischi bensì i "pallini" tipicamente usati negli elenchi puntati. In tal caso, la funzione descritta non produce alcun risultato.

Qualcuno sa quali modifiche bisogna apportare al codice di sopra per rendere la function funzionante anche sotto Windows XP?

Grazie in anticipo.

Pasquale Esposito
Perugia