Mesaj Kutusu Hakkında

1 2
14/08/2018, 11:14

notrino

Merhabalar,

Formdaki bir butona basıldığında "şifre ile bir komutun çalıştırılması" uygulamasını aşağıdaki kod dizilimi ile yapıyorum.

Kod:
Dim Sifre, DogruSifre As Variant

Sifre = InputBox("Şifreyi Yazınız", "Şifre?", , , , "", 0)
DogruSifre = "accesstr.net"

Select Case Len(Sifre)
Case 0
    Exit Sub
Case Else

    If Sifre = DogruSifre Then
        DoCmd.OpenForm "Form1", acNormal
    Else
        MsgBox ("hatalı şifre yazdınız")
    Exit Sub
    End If
End Select

Butona basıldığında çıkan mesaj kutusuna ilgili şifreyi yazarken girdiğim karakterler aynen ekranda gözükmektedir. Ben istiyorum ki girdiğim karakterler ekranda **** şeklinde görünsün. Yani ekrana bakan başkaları için gizlilik oluşsun. Bunun için bu kod diziliminde neyi değiştirmem gerekiyor? Teşekkürler.
14/08/2018, 11:22

ozanakkaya

Aşağıdaki kodları yeni modüle yazıp modülü kaydedin.

Option Compare Database
Option Explicit

Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
                                                     ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long

Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
                                         (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _
                                         ByVal dwThreadId As Long) As Long

Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _
                                           (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _
                                           ByVal wParam As Long, ByVal lParam As Long) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _
                                                                         ByVal lpClassName As String, _
                                                                         ByVal nMaxCount As Long) As Long

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Private Const EM_SETPASSWORDCHAR = &HCC
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
Private Const HC_ACTION = 0

Private hHook As Long

Public Function NewProc(ByVal lngCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Dim RetVal
   Dim strClassName As String, lngBuffer As Long

   If lngCode < HC_ACTION Then
       NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
       Exit Function
   End If

   strClassName = String$(256, " ")
   lngBuffer = 255

   If lngCode = HCBT_ACTIVATE Then

       RetVal = GetClassName(wParam, strClassName, lngBuffer)

       If Left$(strClassName, RetVal) = "#32770" Then


           SendDlgItemMessage wParam, &H1324, EM_SETPASSWORDCHAR, Asc("*"), &H0
       End If

   End If


   CallNextHookEx hHook, lngCode, wParam, lParam

End Function

Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional XPos, _
                       Optional YPos, Optional HelpFile, Optional Context) As String

   Dim lngModHwnd As Long, lngThreadID As Long

   lngThreadID = GetCurrentThreadId
   lngModHwnd = GetModuleHandle(vbNullString)

   hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)

   InputBoxDK = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
   UnhookWindowsHookEx hHook

End Function




Sifre = InputBox("Şifreyi Yazınız", "Şifre?", , , , "", 0)


Şeklindeki kodunuzu


Sifre = InputBoxDK("Şifreyi Yazınız", "Şifre?", , , , "", 0)

Kodu ile değiştirin.
31/08/2018, 15:16

ozanakkaya

Sonuç hakkında olumlu/olumsuz bildirimde bulununuz
31/08/2018, 15:34

notrino

(31/08/2018, 15:16)ozanakkaya yazdı: Sonuç hakkında olumlu/olumsuz bildirimde bulununuz

Merhaba Ozan Bey,

Açıkçası bu çözüm bana ağır geldi. Yani anlamadığım çok detay var, bilgi seviyemi çok aştı. O yüzden kullanmadım. Şifre kutusunda *** yerine rakam görünse de olur dedim..
31/08/2018, 15:39

ozanakkaya

Merhaba, zorluğu yok. en üstteki kodu modüle kaydedeceksin, formdaki kod içerisinde bulunan InputBox yerine InputBoxDK yazacaksın.
31/08/2018, 16:05

notrino

(31/08/2018, 15:39)ozanakkaya yazdı: Merhaba, zorluğu yok. en üstteki kodu modüle kaydedeceksin, formdaki kod içerisinde bulunan InputBox yerine InputBoxDK yazacaksın.

Ozan Bey mesele uygulama meselesi değil. Dediklerinizi yapıp sistemi rahatça o şekilde çalıştırabilirim. Mesele, benim prensiplerimde. Bilgi seviyem dahilinde anlamadığım hiç bir kod dizilimini uygulamalarımda kullanmıyorum. Temelde kod uzmanı olmadığım için sorularımda sorduğum ve cevabını aldığım tüm örnekleri iyice inceliyorum ve neyin ne olduğunu anladıysam (yani öğrendiysem) kullanıyorum. Çünkü ilerde bir problem çıktığında neyin neyden kaynaklandığını ancak o şekilde idrak edebiliyorum. Aksi halde öğrenmeden, sindirmeden sizden gelen herşeyi kopyala-yapıştır yaparsam benim için bir anlamı kalmıyor.
1 2