Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema InputBox
BildScreenshot zu InputBox InputBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

InputBox mit Sternchen in Excel2013 64bit-Version

Betrifft: InputBox mit Sternchen in Excel2013 64bit-Version von: Kasimir
Geschrieben am: 09.10.2014 05:07:36

Hallo an die Helferlein!

Ich habe da ein Problem. Ich habe hier im Forum vor gewisser Zeit ein Makro gefunden, das mi die Eingabe in einer InputBox als Sternchen darstellt. Nun möchte ich diesen Code in Excel 2013 64bit verwenden. Mir wurde beim 1. Starten ein Fenster eingeblendet, aus dem hervor ging, dass die Declare-Anweisung um ein PtrSafe-Atribut erweitert werden muss. Das habe ich nun getan und es werden beim Starten keine Fehler mehr angezeigt. Nachfolgend mal mein jetziger Code:

Option Explicit

#If VBA7 Then
    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 CallNextHookEx Lib "user32" ( _
     ByVal hHook As Long, _
     ByVal ncode As Long, _
     ByVal wParam As Long, _
     ByVal lParam As Any) As Long
    
    Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
     ByVal hWnd1 As Long, _
     ByVal hWnd2 As Long, _
     ByVal lpsz1 As String, _
     ByVal lpsz2 As String) As Long
    
    Private Declare PtrSafe Function GetForegroundWindow Lib "user32" () As Long
    
    Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" ( _
     ByVal hWnd As Long, _
     ByRef lpdwProcessId As Long) As Long
    
    Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _
     ByVal hWnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByVal lParam As Long) As Long
#Else
    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 CallNextHookEx Lib "user32" ( _
     ByVal hHook As Long, _
     ByVal ncode As Long, _
     ByVal wParam As Long, _
     ByVal lParam As Any) As Long
    
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
     ByVal hWnd1 As Long, _
     ByVal hWnd2 As Long, _
     ByVal lpsz1 As String, _
     ByVal lpsz2 As String) As Long
    
    Private Declare Function GetForegroundWindow Lib "user32" () As Long
    
    Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
     ByVal hWnd As Long, _
     ByRef lpdwProcessId As Long) As Long
    
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
     ByVal hWnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByVal lParam As Long) As Long
#End If
Private Const WH_KEYBOARD = 2
Private Const HC_ACTION = 0
Private Const EM_SETPASSWORDCHAR = &HCC

Dim hHook As Long
Dim hThread As Long
Dim hWnd As Long
Dim IsHooked As Boolean

Sub test_inputboxhook()

'   Ein String der Passwort übernimmt.
    Dim strPwd As String

'   Den Hook setzen.
    SetKeyboardHook

'   Aufruf einer InputBox und einlesen des Passwortes.
    strPwd = InputBox("Bitte geben Sie den Code ein:")

'   Den Hook entfernen.
    RemoveKeyboardHook

'   Ausgabe/Weiterverarbeitung des Passwortes.
    MsgBox strPwd

End Sub
Public Sub SetKeyboardHook()

    If Not IsHooked Then

        hWnd = GetForegroundWindow
        hThread = GetWindowThreadProcessId(hWnd, 0)

        If hThread Then _
            hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf WndKeyBoardProc, 0, hThread)

        If hHook Then _
            IsHooked = True

    End If

End Sub
Public Sub RemoveKeyboardHook()
    Dim RetVal As Long
    RetVal = UnhookWindowsHookEx(hHook)
    IsHooked = False
End Sub
Public Function WndKeyBoardProc(ByVal uCode As Long, ByVal wParam As Long, ByVal lParam As Long) _
 _
 _
 _
 As Long

    If uCode >= 0 Then

        Select Case uCode
        Case HC_ACTION
            Call SendMessage(FindWindowEx(GetForegroundWindow, 0, "Edit", ""), _
EM_SETPASSWORDCHAR, 42, lParam)
        Case Else
'           Tue nichts ...
        End Select

    End If

    WndKeyBoardProc = CallNextHookEx(hHook, uCode, wParam, lParam)

End Function


Wenn ich nun aber das Makro zum Aufruf der InputBox aufrufe erhalte ich die Fehlermeldung „Fehler beim Kompilieren: Typen unverträglich“ und es wird mir im Makro „SetKeyboardHook()“ in der Zeile

hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf WndKeyBoardProc, 0, hThread)

der Text

AddressOf WndKeyBoardProc

blau markiert. Ich weiß jetzt ehrlich gesagt nicht, was daran falsch ist, da der Code ja in anderen Excelversionen funktioniert. Kennt von Euch vielleicht jemand das Problem oder hatte dies ebenfalls schon mal und kann mir sagen, was da schief läuft? Wäre super.

Jedenfalls schon mal besten Dank für die Unterstützung,
Kasimir

  

Betrifft: AW: InputBox mit Sternchen in Excel2013 64bit-Version von: Luschi
Geschrieben am: 09.10.2014 08:18:28

Hallo Kasimir,

'WndKeyBoardProc' ist eine Funktion, die aber in Deinem Code fehlt.
Nähere Informationen siehe hier:

http://books.google.de/books?id=Vt-8LH-d1R8C&pg=PA327&lpg=PA327&dq=%22AddressOf+WndKeyBoardProc%22&source=bl&ots=RldDRhP_uP&sig=unAELU25z1p47qza-d4Ftc6I5JA&hl=de&sa=X&ei=sBQ2VI6VOcLMyAOgvYLYCw&ved=0CCcQ6AEwAQ#v=onepage&q=%22AddressOf%20WndKeyBoardProc%22&f=false
 
Gruß von Luschi
aus klein-Paris


  

Betrifft: AW: InputBox mit Sternchen in Excel2013 64bit-Version von: Kasimir
Geschrieben am: 09.10.2014 11:09:30

Hallo Luschi!

Danke Dir für Deine Antwort. Diese Funktion fehlt aber auch in der Version, die unter der 32bit-Version funktioniert. Somit müsste das doch auch in der 64bit-Version laufen oder ist die 64bit-Version dahingehend empfindlicher?

Nochmals Danke,
Kasimir


  

Betrifft: AW: InputBox mit Sternchen in Excel2013 64bit-Version von: Luschi
Geschrieben am: 09.10.2014 12:02:04

Hallo Kasimir,

in der Excel 2013-Vba-Online-Hilfe steht:

 AddressOf procedurename

The required procedurename specifies the procedure whose address is to be passed. It must represent a procedure in a standard module module in the project in which the call is made.
Frei übersetzt heißt das:
- nach 'AddressOf' ist ein Prozedurname erforderlich, welche in einem Standardmodul definiert sein muß
Etwas weiter wird dann noch beschrieben, daß nach 'AddressOf' auch eine Funktion aus einer Dll genutzt werden kann, welche per 'Declare' vorher bekannt gemacht wurde.
Da das aber nicht mit einer einzigen dll-Funktion zu schaffen ist, wird diese Standard-ModulFunktion 'WndKeyBoardProc' dazwischen geschalten.

Hier mal mein 32-bit-Beispiel: https://www.herber.de/bbs/user/93050.xlsm

Aufruf der Inputbox erfolgt, wenn man versucht die AM zu speichern!

Gruß von Luschi
aus klein-Paris


  

Betrifft: AW: InputBox mit Sternchen in Excel2013 64bit-Version von: Kasimir
Geschrieben am: 09.10.2014 13:58:47

Hallo Luschi!

danke Dir für die erneute Hilfe, aber den Code, den Du in der Datei benutzt, habe ich ja bereits und der funktioniert leider nicht in 64bit, auch nicht nach der Umstellung mit PtrSafe.

Gruß
Kasimir


  

Betrifft: verwende eine Userform von: Tino
Geschrieben am: 09.10.2014 18:54:42

Hallo,
mach es dir nicht so schwer, verwende einfach eine Userform.

Nur ein Beispiel
https://www.herber.de/bbs/user/93067.xlsm


Gruß Tino


 

Beiträge aus den Excel-Beispielen zum Thema "InputBox mit Sternchen in Excel2013 64bit-Version"