Hallo Peter,
für das Kopieren der Passwörter habe ich bereits eine etwas elegantere Lösung. Es geht hiermit ganz gut:
Sub SetClipboardText(text As String)
Dim hwnd As Long
Dim hGlobalMemory As Long
Dim lpGlobalMemory As Long
Dim ret As Variant
Dim CF_TEXT As Variant
Dim GMEM_MOVEABLE As Variant
Dim GMEM_ZEROINIT As Variant
On Error Goto error_handler
CF_TEXT = 1
hwnd = NEMGetCurrentSubProgramWindow()
If hwnd Then
hGlobalMemory = GlobalAlloc(Clng(GMEM_MOVEABLE Or GMEM_ZEROINIT), Clng(Len(text)+1))
If hGlobalMemory Then
lpGlobalMemory = GlobalLock(hGlobalMemory)
If lpGlobalMemory Then
ret = lstrcpy(lpGlobalMemory, text)
Call GlobalUnlock(hGlobalMemory)
If OpenClipboard(hwnd) Then
ret = EmptyClipboard()
ret = SetClipboardData(CF_TEXT, hGlobalMemory)
ret = CloseClipboard()
End If
Else
Msgbox "Can't allocated global memory pointer.", 32, "Error"
End If
Else
Msgbox "Can't allocated global memory handle.", 32, "Error"
End If
Else
Msgbox "Can't get window handle.", 32, "Error"
End If
Exit Sub
error_handler:
Print "Error: " + Error$(Err)
Resume Next
End Sub
Damit das Funktioniert, müssen die folgenden Deklarationen vorgenommen werden:
Declare Function OpenClipboard Lib "user32" Alias "OpenClipboard" (Byval hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" Alias "CloseClipboard" () As Long
Declare Function EmptyClipboard Lib "user32" Alias "EmptyClipboard" () As Long
Declare Function GetClipboardData Lib "user32" Alias "GetClipboardData" (Byval wFormat As Long) As Long
Declare Function SetClipboardData Lib "user32" Alias "SetClipboardData" (Byval wFormat As Long, Byval hMem As Long) As Long
Declare Function IsClipboardFormatAvailable Lib "user32" Alias "IsClipboardFormatAvailable" (Byval wFormat As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" Alias "GlobalAlloc" (Byval wFlags As Long, Byval dwBytes As Long) As Long
Declare Function GlobalLock Lib "kernel32" Alias "GlobalLock" (Byval hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" Alias "GlobalUnlock" (Byval hMem As Long) As Long
Declare Function GlobalSize Lib "kernel32" Alias "GlobalSize" (Byval hMem As Long) As Long
Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (Byval lpString1 As Long, Byval lpString2 As String) As Long
Declare Function lstrcpy1 Lib "kernel32" Alias "lstrcpyA"(Byval lpString1 As String, Byval lpString2 As Any) As Long
Declare Function NEMGetCurrentSubprogramWindow Lib "nnotesws.dll" () As Long
Declare Function NEMStopSubprogramWindow Lib "nnotesws.dll" (Byval wHandle As Long) As Integer
Der Code in einem Button oder Link-Hotspot kopiert den Text jedem beliebigen Feld dann mit diesem Aufruf:
Call SetClipboardText(Doc.Fieldname(0))
Für das bessere Verständnis von meinem Vorhaben, welches mittlerweile bereits realisiert wurde, habe ich unten mal ein paar Screenshots (jeweils im Bearbeiten- und Lese-Modus) angehangen.
Ich kann in einem Dokument einen Benutzernamen, drei Passwörter und fünf Seriennummer speichern. Die Passwörter sind im Lese-Modus versteckt, die Seriennummern immer sichtbar. Damit kann man dann z.B. recht komfortabel die Login-Daten von seinem Mobilfunk-Provider speichern, sowie die PIN und PUK von seiner SIM-Karte plus die IMSI. Alternativ natürlich den Router-Zugang plus WLAN-Kennwort. Mit der Maske kann ich eigentlich alle meine Use-Cases erschlagen. Die Benennung der Passwörter und Seriennummern lässt sich im Bearbeiten-Modus ändern.
Auslöser für diesen Thread war nun, dass ich das Passwort manchmal gern gewusst hätte, wenn ich es in die Zwischenablage kopiere. Dafür hatte ich von Anfang an die Statusleiste im Auge. Ich war mir nur nicht sicher, ob das irgendwo mitgeloggt werden würde, was für mich ein nicht akzeptables Risiko dargestellt hätte.
Als i-Tüpfelchen hat die DB auch noch einen Passwort-Generator. Den Code habe ich hier aus dem Forum und dafür bedanke ich mich an dieser Stelle ganz herzlich bei User Eknori, der hier seit Jahren wertvolle Tipps postet! Die Datenbank war übrigens ein OpenNTF-Projekt (
link), welches die Kopieren-Funktion bereits mitbrachte.