Results 1 to 2 of 2

Thread: Code wont work with office 64 bit

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1

    Code wont work with office 64 bit

    I used the code below to mask the characters typed into an input box. It worked fine with 32 bit office. I had to add ptrsafe stop the database showing an error on startup. Despite this the code no longer functions in office 64 bit.

    Can anyone help getting it working again or point me to another version that will?

    ' Password masked inputbox
    ' Allows you to hide characters entered in a VBA Inputbox.
    ' Code written by Daniel Klann
    ' March 2003
    'API functions to be used
    Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
        ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" _
        (ByVal lpModuleName As String) As Long
    Private Declare PtrSafe 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 PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Private Declare PtrSafe 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 PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _
        ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long
    ' Constants to be used in our API functions
    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    'A window has been activated
            retval = GetClassName(wParam, strClassName, lngBuffer)
            If Left$(strClassName, retval) = "#32770" Then  'Class name of the Inputbox
                ' This changes the edit control so that it display the password character *.
                ' You can change the Asc("*") as you please.
                SendDlgItemMessage wParam, &H1324, EM_SETPASSWORDCHAR, Asc("*"), &H0
            End If
        End If
        ' This line will ensure that any other hooks that may be in place are called correctly.
        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  'Hope someone can use it!
    Last edited by Aussiebear; 01-06-2025 at 08:25 PM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •