
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.