Hi zusammen,
ich habe ein kleines Programm geschrieben, welches die Passworteingabe bei PDF-Dateien automatisieren kann. Das wollte ich euch nicht vorenthalten, da der ein oder andere vielleicht auch z.B. Rechnungen via E-Mail im PDF-Format bekommt, die dann noch mit der Kundennummer oder so als Passwort "geschützt" sind, was - wie ich finde - irgendwie nervt :wacko: .
Zur Funktionsweise: die Passwörter werden im Format "Alias : Passwort" zeilenweise (im Klartext) in einer Text-Datei gespeichert (um den Doppelpunkt sind eigentlich keine Leerzeichen, aber wenn ich die wegmache erstellt mir der Editor automatisch einen Smiley ). Sollte nur eine Zeile vorhanden sein, wird standardmäßig automatisch durchgeloggt, ansonsten wird eine GUI zur Auswahl angeboten. Es stehen auch noch die Optionen "Immer GUI anzeigen (always_gui)" und "Kein Tray Symbol anzeigen (no_icon)" zur Verfügung, welche als Parameter übergeben werden können.
Im Prinzip läuft es schon, ich habe nur mal noch eine Frage bzgl. der "Eleganz" (was die Programmierung betrifft) .
Im folgenden Teil erstelle ich dynamisch die Buttons über welche die Passwörter ausgewählt werden können:
For $line In $passwords
$couple = StringSplit($line, ":", 3)
$buttons[$line_counter] = GUICtrlCreateButton($couple[0], 20, 60 + (37 * $line_counter), 190, 32)
$line_counter += 1
Next
Und in diesem Teil überwache ich die GUI:
[autoit]$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
[...]
Case $msg <> 0
$shift = 4
[/autoit][autoit][/autoit][autoit]If $msg >= $shift And $msg <= $shift + $anz_passwords Then
[/autoit][autoit][/autoit][autoit]$couple = StringSplit($passwords[$msg - $shift], ":", 3)
$password = StringStripWS($couple[1], 3)
WinActivate($pass_win_handle)
Send($password)
Send("{ENTER}")
GUISetState(@SW_HIDE)
Sleep(2000)
EndIf
EndSelect
Diesen Teil habe ich - wie man sehen kann - irgendwie nicht so smooth hinbekommen. Ich habe festgestellt, dass der erste Button $msg =4 erzeugt, und alle weiteren eben +1. Auf diese Weise werden quasi die Buttons auf das Passwort-Array gemappt. Hat jemand vielleicht einen Vorschlag, wie man das besser machen kann?
Hier das ganze Programm:
Spoiler anzeigen
;Ausstiegsoption (falls kein icon angezeigt wird) mit STRG + SHIFT + Q bzw. STRG + ALT + Q
HotKeySet("^+q", "exit_now")
HotKeySet("^!q", "exit_now")
;Nur einen Start zulassen
If _Singleton("pdf_password_helper", 1) = 0 Then Exit
;Includes
#include-once
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include "Array.au3"
#include <Misc.au3>
#include <File.au3>
;Fenster-Titel-Erkennungsmethode (auch Teil-Texte erkennen)
AutoItSetOption("WinTitleMatchMode", 2)
;Tray-Menü anpassen
Opt("TrayOnEventMode",1)
Opt("TrayMenuMode",1)
TraySetIcon(@WindowsDir & "\system32\shell32.dll", 45)
$exit = TrayCreateItem("Exit")
TrayItemSetOnEvent(-1, "exit_now")
;GUI-Anzeigemodus (Standard) setzen
$always_show_gui = False
;-----------------------------------------------------------------
;Kommandozeilen-Parameter (in beliebiger Reihenfolge)
;-----------------------------------------------------------------
;no_icon: Tray-Icon verstecken
;always_gui: GUI immer anzeigen, auch wenn nur ein Passwort in der Liste steht (sonst direkt durchloggen)
If $CmdLine[0] >= 1 Then
If _ArraySearch($CmdLine, "no_icon") <> -1 Then Opt("TrayIconHide", 1)
If _ArraySearch($CmdLine, "always_gui") <> -1 Then $always_show_gui = True
EndIf
;-----------------------------------------------------------------
;Passwort-Datei
$password_file = @ScriptDir & "\passwords.txt"
If Not FileExists($password_file) Then FileWrite($password_file, "Passwort 1:streng geheim" & @CRLF & "Passwort 2:auch streng geheim")
;Passwörter einlesen
Dim $passwords
_FileReadToArray($password_file, $passwords)
If Not IsArray($passwords) Or (IsArray($passwords) And $passwords[0] = 0) Then
MsgBox(64, "Fehler", "Es konnten keine Passwörter gefunden werden. Das Programm wird beendet.")
Exit
Else
$anz_passwords = $passwords[0]
;Erste Zeile löschen und Array für Buttons dimensionieren
_ArrayDelete($passwords, 0)
Dim $buttons[$anz_passwords]
EndIf
[/autoit] [autoit][/autoit] [autoit];Ggf. GUI erstellen
If $anz_passwords > 1 Or $always_show_gui = True Then
GUICreate("", 230, 120 + (25 * $anz_passwords), -1, -1, -1, $WS_EX_TOPMOST)
GUISetBkColor(0xFEFFDF)
GUICtrlCreateLabel("Bitte wählen Sie ein Passwort aus:", 10, 22, 220)
GUICtrlSetFont(-1, 9)
$line_counter = 0
For $line In $passwords
$couple = StringSplit($line, ":", 3)
$buttons[$line_counter] = GUICtrlCreateButton($couple[0], 20, 60 + (37 * $line_counter), 190, 32)
$line_counter += 1
Next
EndIf
[/autoit] [autoit][/autoit] [autoit];Auf das Login-Fenster warten
While 1
If ProcessExists("AcroRD32.exe") And WinExists("Kennwort") Then
[/autoit] [autoit][/autoit] [autoit]$pass_win_handle = WinGetHandle("Kennwort")
[/autoit] [autoit][/autoit] [autoit]If $anz_passwords = 1 And $always_show_gui = Not True Then
[/autoit] [autoit][/autoit] [autoit]$couple = StringSplit($passwords[0], ":", 3)
$password = StringStripWS($couple[1], 3)
WinActivate($pass_win_handle)
Send($password)
Send("{ENTER}")
Sleep(2000)
Else
;GUI anzeigen
GUISetState()
;GUI überwachen
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
GUISetState(@SW_HIDE)
WinWaitClose($pass_win_handle)
Case $msg <> 0
[/autoit] [autoit][/autoit] [autoit]$shift = 4
[/autoit] [autoit][/autoit] [autoit]If $msg >= $shift And $msg <= $shift + $anz_passwords Then
[/autoit] [autoit][/autoit] [autoit]$couple = StringSplit($passwords[$msg - $shift], ":", 3)
$password = StringStripWS($couple[1], 3)
WinActivate($pass_win_handle)
Send($password)
Send("{ENTER}")
GUISetState(@SW_HIDE)
Sleep(2000)
EndIf
EndSelect
EndIf
[/autoit] [autoit][/autoit] [autoit]EndIf
[/autoit] [autoit][/autoit] [autoit]Sleep(100)
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit];----------------------------------------
Func exit_now()
MsgBox(64, "Hinweis", "Das Programm wird nun beendet", 1)
Exit
EndFunc
[/autoit]
Gruß Trainer