Jump to content

File to Base64 String Code Generator v1.20 Build 2020-06-05 (embed your files easily)


UEZ
 Share

Recommended Posts

I created the image using XnView by appending each of the small images to the right side.

_GUICtrlToolbar_SetBitmapSize() defines the size of each image, _GUICtrlToolbar_AddBitmap() add the image to the toolbar and _GUICtrlToolbar_AddButton() associates each of the images.

Br,

UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

  • 3 weeks later...

Fixed a critical bug when multi files have been selected and compression was activated. The non compressed string was saved in function instead of compressed one (decompression function tried to decompress non compressed string)!

See post#1

Sorry,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

  • 6 months later...

I've been using this in a script I was playing around with and I came up with a change that might be of interest. In the extraction process, when saving the file to disk, the function created will save the file to the @ScriptDir. I have modified the Create_Function function in the main script slightly, that allows for specifying where to save the file.

Func Create_Function(ByRef $Script, $VarName, $BinaryString, $BinStringLen, $LineLen, $compression, $BinarySuffix, $sFile)
    $Script &= "Func _" & $VarName & "($bSaveBinary = False, $sSavePath = @ScriptDir)" & @LF & @TAB & "Local $" & $VarName & @LF ; <<<<< Changed this line to include a save path variable, set to the default of the @scriptdir so no changes needed with old scripts
    If $BinStringLen > $LineLen Then 
        Local $aBinString = StringRegExp($BinaryString, ".{" & $LineLen & "}", 3)
        For $i = 0 To UBound($aBinString) - 1
            $Script &= @TAB & "$" & $VarName & " &= '" & $aBinString[$i] & "'" & @LF
        Next
        $Script &= @TAB & "$" & $VarName & " &= '" & $BinarySuffix & "'" & @LF
    Else
        $Script &= @TAB & "$" & $VarName & " &= '" & $BinaryString & "'" & @LF
    EndIf
    If Not $compression Then
        $Script &= @TAB & "Local $bString = Binary(_Base64Decode($" & $VarName & "))" & @LF
        $compressed = False
    Else
        $Script &= @TAB & "$" & $VarName & " = _Base64Decode($" & $VarName & ")" & @LF
        $Script &= @TAB & "Local $tSource = DllStructCreate('byte[' & BinaryLen($" & $VarName & ") & ']')" & @LF
        $Script &= @TAB & "DllStructSetData($tSource, 1, $" & $VarName & ")" & @LF
        $Script &= @TAB & "Local $tDecompress" & @LF
        $Script &= @TAB & "_WinAPI_LZNTDecompress($tSource, $tDecompress, " & FileGetSize($sFile) & ")" & @LF
        $Script &= @TAB & "$tSource = 0" & @LF
        $Script &= @TAB & "Local $bString = Binary(DllStructGetData($tDecompress, 1))" & @LF
        $compressed = True
    EndIf
    $Script &= @TAB & "If $bSaveBinary Then" & @LF
    $Script &= @TAB & @TAB & 'Local $hFile = FileOpen($sSavePath & "\' & $sFile & '", 18)' & @LF ; <<<<< changed this line t reference the new variable instead of using @ScriptDir
    $Script &= @TAB & @TAB & "FileWrite($hFile, $bString)" & @LF 
    $Script &= @TAB & @TAB & "FileClose($hFile)" & @LF
    $Script &= @TAB & "EndIf" & @LF
    $Script &= @TAB & "Return  $bString" & @LF
    $Script &= "EndFunc   ;==>_" & $VarName & @LF & @LF
EndFunc   ;==>Create_Function

One other thing, shouldn't all those @LF be @CRLF when dealing with text files on a Windows machine?

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

Thanks BrewManNH for your suggestion. It makes the function more flexible regarding the save option.

I cannot remember why I added only @LF instead of @CRLF. I think the most editors will support @LF, too but I changed it @CRLF.

Br,

UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

There is a shit bug since v1.11 Build 2013-02-19 where the binary code is not working when compress option is selected!

I'm wondering that nobody reported it here although a lot of downloads were made.

IF YOU ARE USING v1.11 Build 2013-02-19 or v1.11 Build 2013-03-25 PLEASE UPDATE IT!

Sorry for the inconveniences!

Br,

UEZ :>

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

I made a bunch of changes to your source a while back which must have inadvertently fixed the bug I suppose, cause I've successfully used it with compression enabled. If you're interested I can post or PM my version and you can cherry pick what you like.

Link to comment
Share on other sites

Sure, just send me your version I will pick the cherries if I can find them ;)

Btw, this was the faulty function:

Func Create_Function(ByRef $Script, $VarName, $BinaryString, $BinStringLen, $LineLen, $compression, $BinarySuffix, $sFile)
    $Script &= "Func _" & $VarName & "($bSaveBinary = False)" & @LF & @TAB & "Local $" & $VarName & @LF
    If $BinStringLen > $LineLen Then
        Local $aBinString = StringRegExp($BinaryString, ".{" & $LineLen & "}", 3)
        For $i = 0 To UBound($aBinString) - 1
            $Script &= @TAB & "$" & $VarName & " &= '" & $aBinString[$i] & "'" & @LF
        Next
        $Script &= @TAB & "$" & $VarName & " &= '" & $BinarySuffix & "'" & @LF
    Else
        $Script &= @TAB & "$" & $VarName & " &= '" & $BinaryString & "'" & @LF
    EndIf
    If Not $compression Then
        $Script &= @TAB & "Local $bString = Binary(_Base64Decode($" & $VarName & "))" & @LF
        $compressed = False
    Else
        $Script &= @TAB & "$" & $VarName & " = _Base64Decode($" & $VarName & ")" & @LF
        $Script &= @TAB & "Local $tSource = DllStructCreate('byte[' & BinaryLen($" & $VarName & ") & ']')" & @LF
        $Script &= @TAB & "DllStructSetData($tSource, 1, $" & $VarName & ")" & @LF
        $Script &= @TAB & "Local $tDecompress" & @LF
        $Script &= @TAB & "_WinAPI_LZNTDecompress($tSource, $tDecompress, " & FileGetSize($sFile) & ")" & @LF
        $Script &= @TAB & "$tSource = 0" & @LF
        $Script &= @TAB & "Local $bString = Binary(DllStructGetData($tDecompress, 1))" & @LF
        $compressed = True
    EndIf
    $Script &= @TAB & "If $bSaveBinary Then" & @LF
    $Script &= @TAB & @TAB & 'Local $hFile = FileOpen(@ScriptDir & "\' & $sFile & '", 18)' & @LF
    $Script &= @TAB & @TAB & "FileWrite($hFile, $bString)" & @LF
    $Script &= @TAB & @TAB & "FileClose($hFile)" & @LF
    $Script &= @TAB & "EndIf" & @LF
    $Script &= @TAB & "Return  $bString" & @LF
    $Script &= "EndFunc   ;==>_" & $VarName & @LF & @LF
EndFunc   ;==>Create_Function

Or better say the faulty line

$Script &= @TAB & "_WinAPI_LZNTDecompress($tSource, $tDecompress, " & FileGetSize($sFile) & ")" & @LF

was not working because FileGetSize($sFile) always returned 0 and thus decompression call was not successful everytime.

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

  • 10 months later...

What are you trying to code? A keylogger?  :naughty:

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

hi

sorry no this is not a keylogger!

i`m a beginner in programming.

On my Workstation i have a mill Software for my milling machine.

I Need to save all the Numbers i type.

i find this code on Internet and Need to accommdate it

But i don`t understand how to include the ini file in my code

or is there an other way to do my code?

Link to comment
Share on other sites

  • Moderators

turbobaby,

Please see this announcement to understand that any code that watches all keys is not permitted here - even if it is not a keylogger as such. However, if all you are looking for is to trap the numeric 0-9 keys then I might be prepared to accept that this would fall within the "a few keys" exception. ;)

So I suggest you start a new thread in "General Help & Support" explaining exactly what it is you want to do -"save all the Numbers i type" is a bit vague and you will need to be a lot clearer as to why you need to save these keystrokes and exactly what keys are involved. I look forward to reading it. :)

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

You have to save your ini file first before you use it. This can be done by calling _Tasten(1) before you read your ini file.

Turbobaby: dein Programm klingt nach einem Keylogger, d.h. du bewegst dich in einer Grauzone bzw. in einer verbotenen Zone! Was ist eine Milling Machine?

Br,

UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

es ist eine Fräsmaschine und beim programmieren muss ich jeden Tag da tausende von Zahlen tippen.

Aber ich möchte gerne allgemein herausfinden, wie ich eine Datei in den Code integriere und mit einfachem Code die Datei abrufe.

Wenn ich so vorgehe, wie z.B. der Code mit der Wave abspielen Datei, dann gelingt es mir nicht die ini oder text Datei auszulesen und die Codes wiederzugeben.

Ich habe z.B. einen Code zusammengebastelt, mit dem ich meinen Router reconnecten kann.

Das sieht so aus:

$VERSION = "3.1.0.1"
if _Singleton("Skript",1) = 0 Then Exit
   
#Region AutoIt3Wrapper directives section
#RequireAdmin
#AutoIt3Wrapper_UseX64=Y
#AutoIt3Wrapper_OutFile_Type=exe
#AutoIt3Wrapper_OutFile_X64=Fritzbox reconnect x64.exe
#AutoIt3Wrapper_Compile_both=Y
;#AutoIt3Wrapper_Icon=FritzDSL.ico
#AutoIt3Wrapper_Outfile=Reconnect.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Comment=fritz!box reconnect
#AutoIt3Wrapper_Res_Description=Turbobaby's Reconnect
#AutoIt3Wrapper_Res_Fileversion=$VERSION
#AutoIt3Wrapper_Res_ProductVersion=3.1
#AutoIt3Wrapper_Res_Language=1031
#EndRegion

#include <IE.au3>
#include <INet.au3>
#include <GUIConstants.au3>
#include <Constants.au3>
#include <WebTCP.au3>
#include <Misc.au3>
#include <Array.au3>
#include <WinAPI.au3>
#include <Process.au3>
#include <APIConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>

Global $Paused
Global $_ConsoleText
Global $_LogFile
Global $LogDateiErstellen
$timerstart = TimerInit()
_Console("Mit ESC kann man den laufenden reconnect jederzeit unterbrechen.")
HotKeySet("{ESC}", "Beenden")

         _Console("Es wird überprüft ob die Datei reconnect.ini vorhanden ist")
If Not FileExists (@scriptdir & '\reconnect.ini') then call ("INIFILE")
   $LogDateiErstellen = IniRead("reconnect.ini","SONSTIGES","LogDateiErstellen",0)
         If not ($LogDateiErstellen="YES") Then IniWrite("reconnect.ini", "SONSTIGES", "LogDateiErstellen", "NEIN")
            If FileExists (@scriptdir & '\reconnect.log') Then _Console("--------------------------------------------------------------------------")
            _Console("Turbobaby's Reconnect " & $VERSION)
            _Console("reconnect.ini wird eingelesen")
   $FritzBox = IniRead("reconnect.ini","BOX","RouterIpTelefonie",0)
   $FritzBox2 = IniRead("reconnect.ini","BOX","RouterIpInternetverbindung",0)
   $Benutzer = IniRead("reconnect.ini","BOX","Benutzername",0)
   $Passwort = IniRead("reconnect.ini","BOX","Passwort",0)
   $Telefonie = IniRead("reconnect.ini","LINKS","Telefonie",0)
   $NeuVerbinden = IniRead("reconnect.ini","LINKS","NeuVerbinden",0)
   $UPNPVersuchen = IniRead("reconnect.ini","LINKS","UPNPVersuchen",0)
   $NeuStartenLink = IniRead("reconnect.ini","LINKS","NeuStartenLink",0)
   $NeuStarten = IniRead("reconnect.ini","LINKS","NeuStarten",0)
   $VoipCheck = IniRead("reconnect.ini","HTML","VoipCheck",0)
   $LogInUserFeld = IniRead("reconnect.ini","HTML","LogInUserFeld",0)
   $LogInPasswortFeld = IniRead("reconnect.ini","HTML","LogInPasswortFeld",0)
   $LogInButtonID = IniRead("reconnect.ini","HTML","LogInButtonID",0)
   $NeuVerbindenButton = IniRead("reconnect.ini","HTML","NeuVerbindenButton",0) 
   $NeuVerbindenID = IniRead("reconnect.ini","HTML","NeuVerbindenID",0)
   $NeuStartenButton = IniRead("reconnect.ini","HTML","NeuStartenButton",0) 
   $NeuStartenName = IniRead("reconnect.ini","HTML","NeuStartenName",0)   
   $ToolTipsAnzeigen = IniRead("reconnect.ini","SONSTIGES","ToolTipsAnzeigen",0)
   $Ton = IniRead("reconnect.ini","SONSTIGES","Ton",0)
   $VoipChecken = IniRead("reconnect.ini","SONSTIGES","VoipChecken",0)
   $ShowScreen = IniRead("reconnect.ini","SONSTIGES","ShowScreen",0)
   $ProgrammZeitlichBeenden = IniRead("reconnect.ini","SONSTIGES","ProgrammZeitlichBeenden",0)
   $ZEITLIMIT = IniRead("reconnect.ini","SONSTIGES","ZEITLIMIT",0)
   $ProgrammPausieren = IniRead("reconnect.ini","SONSTIGES","ProgrammPausieren",0)
   $PausenCountdown = IniRead("reconnect.ini","SONSTIGES","PausenCountdown",0)
   
      TraySetIcon("FritzDSL.ico")
      TraySetToolTip("Turbobaby's Reconnect " & $VERSION)
      Opt("TrayOnEventMode", 1)
      Opt("TrayMenuMode", 1)
      Opt("TrayAutoPause", 0)
      $INFO = TrayCreateItem("Über Turbobaby's Reconnect")
      $INIFILEINFO = TrayCreateItem("So sollte die Reconnect.ini Datei aussehen")
      TrayCreateItem("")
      $EXIT = TrayCreateItem("Reconnect Abbrechen")
      TrayItemSetOnEvent($INFO, "Info")
      TrayItemSetOnEvent($INIFILEINFO, "INIFILEINFO")
      TrayItemSetOnEvent(-1, "ExitEvent")

_Console("Eine GUI für den Internet Explorer wird erstellt.")
$oIE = _IECreateEmbedded()
$Form1 = GUICreate("FritzBox Reconnect", 1024, 640, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN))
$IE_1_GUI = GUICtrlCreateObj($oIE, 0, 0, @DesktopWidth, @DesktopHeight, $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT + $ES_AUTOVSCROLL + $WS_VSCROLL)
If $ShowScreen='JA' Then GUISetState(@SW_SHOW)
If $ShowScreen='JA' Then GUISetState(@SW_MAXIMIZE)

If Ping($FritzBox,250)=0 Then Call ("RouterNichtGefunden")
If Ping($FritzBox2,250)=0 Then Call ("RouterNichtGefunden")
   
For $i = 10 To 1 Step -1
   $IPalt = _GetIP()
   $IPneu = $IPalt
   If $IPneu>0 then $i=0
Next
_Console("Die aktuelle IP wird abgefragt. Die Alte IP lautet: " & $IPalt)

_Console("Falls der Ton auf AN steht, sollte der jetzt abgespielt werden.")
$binWave = Wave()
$tWave = DllStructCreate('byte[' & BinaryLen($binWave) & ']')
$pWave = DllStructGetPtr($tWave)
DllStructSetData($tWave, 1, $binWave)
If $Ton = "AN" then _WinAPI_PlaySound($pWave, BitOR($SND_ASYNC, $SND_MEMORY, $SND_NOWAIT))
$tWave = 0
_Console("Mit F7 kann man die Info anzeigen lassen.")
HotKeySet("{F7}", "INIFILEINFO")

If $VoipChecken = 'JA' Then Call ("VORCHECK")

If $ProgrammPausieren="JA" Then
   HotKeySet("{PAUSE}", "Pause")
   _Console("Mit der Pause Taste kann mann das Programm pausieren.")
      For $i = $PausenCountdown To 1 Step -1
         If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: "& $IPalt &" - Neue IP: ?.?.?.?", "Keine Telefonate! Reconnect startet in " _
         & $i & " Sekunden."& @CRLF &"Zum pausieren des reconnects Pause-Taste drücken." , 20, 1)
         Sleep(1000)
      Next
EndIf

If $NeuStarten='JA' then
   call ("reboot")
Else
   Call ("VERBINDEN")
   Call ("ABGLEICH")
      For $i = 10 To 1 Step -1
         $IPneu = _GetIP()
         Sleep(100)
         If $IPneu>0 then $i=0
      Next
   _Console("Die IP wird nochmals abgefragt: " & $IPneu)
   If $IPneu = $IPalt Then Call ("VERBINDEN")
EndIf

If $IPneu = $IPalt Then
   For $i = 5 To 1 Step -1
      $IPneu = _GetIP()
      Sleep(100)
      If $IPneu>0 then $i=0
   Next
_Console("Die IP wird nochmals abgefragt: " & $IPneu)
EndIf

If $IPneu = $IPalt Then Call ("FEHLER")
Call ("ERFOLGREICH")
_Console("Neue Ip lautet: " & $IPneu)

Func ABGLEICH()
   For $i = 5 To 1 Step -1
      $IPneu = _GetIP()
      Sleep(100)
      If $IPneu>0 then $i=0
   Next
_Console("Die IP wird nochmals abgefragt: " & $IPneu)
EndFunc

Func VORCHECK()
      If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: " & $IPalt & " - Neue IP: ?.?.?.?", "Voip-Leitungen werden überprüft " , 20, 1)
      _Console("Jetzt wird zum ersten mal überprüft ob eine aktive Telefonieleitung besteht.")
      _Console("Die Seite http://" & $FritzBox & $Telefonie & " wird aufgerufen")
      _IENavigate($oIE, "http://" & $FritzBox & $Telefonie)
      $oUser =_IEGetObjByName($oIE,$LogInUserFeld)
      $oPass =_IEGetObjByName($oIE,$LogInPasswortFeld)
      $oSubmit = _IEGetObjByID($oIE,$LogInButtonID)
      _Console("Der Benutzername, falls benötigt, wird eingegeben.")
      _IEFormElementSetValue ($oUser, $Benutzer)
      _Console("Das Passwort, falls benötigt, wird eingegeben.")
      _IEFormElementSetValue ($oPass, $Passwort)
      _Console("Nun wird auf LOGIN gedrückt.")
      _IEAction ($oSubmit, "click")
      _IELoadWait($oIE)
      _Console("Nun wird die ganze HTML Seite in den Speicher geladen.")
      $HTML = _IEDocReadHTML ($oIE)
      _Console('Jetzt wird überprüft ob das Wort "'& $VoipCheck &'" in dem ausgelesenen HTML Code drin vorkommt.')
      $ueberpruefen = StringInStr($HTML, $VoipCheck)
      If $ueberpruefen=0 Then _Console("Keine Telefonate auf der " & $FritzBox & " entdeckt ")
      If $ueberpruefen>0 Then _Console("Vorcheck: Zurzeit wird über die " & $FritzBox & " telefoniert ")
      If $ueberpruefen>0 Then Call ("VOIPCHECK")
EndFunc
      
Func VERBINDEN()
   _Console("Alte IP war: " & $IPalt) 
   If $UPNPVersuchen="JA" Then Call ("UPNPNEUAUFBAUEN")
      For $i = 5 To 1 Step -1
         $IPneu = _GetIP()
         Sleep(100)
         If $IPneu>0 then $i=0
      Next
   _Console("Aktuelle IP überprüfen, sie lautet: " & $IPneu)
   If $IPneu = $IPalt Then Call ("NEUAUFBAUEN")
   If $IPneu = $IPalt Then $IPneu = _GetIP()
   If $IPneu = $IPalt Then _Console("Aktuelle IP überprüfen, sie lautet: " & $IPneu)
EndFunc
   
Func NEUAUFBAUEN()
   If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: " & $IPalt & _
      " - Neue IP: ?.?.?.?", "Keine Telefonate! Die Internetverbindung wird über die FritzBox aufgebaut.", 20, 1)
         _IENavigate($oIE, "http://" & $FritzBox2 & $NeuVerbinden)
         $oUser =_IEGetObjByName($oIE,$LogInUserFeld)
         $oPass =_IEGetObjByName($oIE,$LogInPasswortFeld)
         $oSubmit = _IEGetObjByID($oIE,$LogInButtonID)
         _IEFormElementSetValue ($oUser, $Benutzer)
         _IEFormElementSetValue ($oPass, $Passwort)
         _IEAction ($oSubmit, "click")
         _IELoadWait($oIE)
         $HTML = _IEDocReadHTML ($oIE)
         $vorhanden = StringInStr($HTML,$NeuVerbindenButton)
         _Console('Das Wort "Neu verbinden" von dem Router "' & $FritzBox2 & '" steht auf der ' & $vorhanden & ' stelle')
         $Button = _IEGetObjByID ($oIE,$NeuVerbindenID)
         _IEAction($Button,"click")
         _IELoadWait($oIE)
EndFunc

Func UPNPNEUAUFBAUEN()
   If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: " & $IPalt & _
      " - Neue IP: ?.?.?.?", "Keine Telefonate! Die Internetverbindung wird über UPnP neu aufgebaut.", 20, 1)
      _WebTcp_Startup() 
      $oWebTCP = _WebTcp_Create() 
      $sPacket = '<?xml version="1.0" encoding="utf-8"?>' & @CRLF & _ 
      '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' & @CRLF & _ 
      ' <s:Body>' & @CRLF & _ 
      ' <u:ForceTermination xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" />' & @CRLF & _ 
      ' </s:Body>' & @CRLF & _ 
      '</s:Envelope>' 
      $oWebTCP.Navigate("http://" & $FritzBox2 & ":49000/upnp/control/WANIPConn1", $sPacket, "text/xml", 49000, _
      False, 'SOAPACTION: urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination') 
      _Console("Alte IP war: " & $IPalt) 
         For $i = 10 To 1 Step -1
            $IPneu = _GetIP()
            Sleep(100)
            If $IPneu>0 then $i=0
         Next
      _Console("aktuelle IP wird abgeglichen: " & $IPneu)
   EndFunc

Func ZEITLIMITEXIT()
   If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: " & $IPalt & _
      " - Neue IP: ?.?.?.?","ACHTUNG: Das eingestellte Zeitlimit wurde erreicht. Programm wird beendet.", 20, 1)
   Sleep(5000)
   Call ("EXITEVENT")
EndFunc

Func FEHLER()
   If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: " & $IPalt & _
      " - Neue IP: ?.?.?.?","F E H L E R: Reconnect war nicht erfolgreich. Programm wird beendet.", 20, 1)
   Sleep(5000)
   Call ("EXITEVENT")
EndFunc

Func RouterNichtGefunden()
   If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: " & $IPalt & _
      " - Neue IP: ?.?.?.?","F E H L E R: Der Router wurde nicht gefunden. Programm wird beendet.", 20, 1)
   Sleep(5000)
   Call ("EXITEVENT")
EndFunc

Func ERFOLGREICH()
   If $NeuStarten='JA' then
      If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Neue IP: " & $IPneu, _
         "Router erfolgreich neu gestartet. Alte Ip war: " & $IPalt, 20, 1)
      Sleep (5000)
   Else
      If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Neue IP: " & $IPneu, _
         "Neue IP erfolgreich aufgebaut. Alte Ip war: " & $IPalt, 20, 1)
      Sleep (5000)
   EndIf
EndFunc

Func INFO()
    TrayTip("Turbobaby's Reconnect", "Version " & $VERSION, 20, 1)
    Sleep(2000)
 EndFunc
 
 Func INIFILEINFO()
   If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect", "Version " & $VERSION, 20, 1)
   $Text1 = '# Achtung: diese Datei kann gelöscht werden, wenn versehentlich zu viel experimentiert wurde.' _
   &@CRLF&'# Die Musterdatei wird dann automatisch neu erstellt.' _
   &@CRLF&'# Bitte passen sie die Einstellungen nach ihren Daten an.' _
   &@CRLF&@CRLF
   $Text2 = '[BOX]' _
   &@CRLF&'# Hier sind persönliche Dateien für die FritzBox.' _
   &@CRLF&'RouterIpTelefonie=192.168.177.1' _
   &@CRLF&'RouterIpInternetverbindung=192.168.177.100' _
   &@CRLF&'Benutzername=Max Mustermann' _
   &@CRLF&'Passwort=Test01' _
   &@CRLF&@CRLF
   $Text3 = '[LINKS]' _
   &@CRLF&'# Hier stehen die Links, wo auf der FritzBox zugegriffen wird.' _
   &@CRLF&'Telefonie=/login.lua?page=/home/home.lua' _
   &@CRLF&'NeuVerbinden=/login.lua?page=/internet/inetstat_monitor.lua' _
   &@CRLF&'UPNPVersuchen=JA' _
   &@CRLF&'NeuStartenLink=/login.lua?page=/system/reboot.lua' _
   &@CRLF&'NeuStarten=JA' _
   &@CRLF&@CRLF
   $Text4 = '[HTML]' _
   &@CRLF&'# Hier stehen die Wörter, wonach gesucht wird, bzw. wie die einzelnen Buttons und LogIn Felder heissen.' _
   &@CRLF&'VoipCheck=call_direction_' _
   &@CRLF&'LogInUserFeld=uiUser' _
   &@CRLF&'LogInPasswortFeld=uiPass' _
   &@CRLF&'LogInButtonID=uiSubmitLogin' _
   &@CRLF&'NeuVerbindenButton=Neu verbinden' _
   &@CRLF&'NeuVerbindenID=uiReconnectBtn' _
   &@CRLF&'NeuStartenButton=Neu starten' _
   &@CRLF&'NeuStartenName=reboot' _
   &@CRLF&@CRLF
   $Text5 = '[SONSTIGES]' _
   &@CRLF&'# Die Logdatei kann nur einmal erzeugt werden, danach wird der Wert automatisch auf NEIN gesetzt.' _
   &@CRLF&'# Die Datei dient rein für eine Fehleranalyse.' _
   &@CRLF&'# Diese Einstellung gehört zur BETA Phase, und wird in zukunft noch ausgebaut.' _
   &@CRLF&'# Zeitlimit in Sekunden einstellen z.B. 540 für 9 Minuten' _
   &@CRLF&'LogDateiErstellen=NEIN' _
   &@CRLF&'ToolTipsAnzeigen=AN' _
   &@CRLF&'Ton=AN' _
   &@CRLF&'VoipChecken=JA' _
   &@CRLF&'ShowScreen=NEIN' _
   &@CRLF&'ProgrammZeitlichBeenden=JA' _
   &@CRLF&'ZEITLIMIT=540' _
   &@CRLF&'ProgrammPausieren=JA' _
   &@CRLF&'PausenCountdown=10' _
   &@CRLF&@CRLF
   MsgBox (4096, "So sollte die Reconnect.ini Datei aussehen", $Text1 & $Text2 & $Text3 & $Text4 & $Text5 ,20)
    Sleep(2000)
EndFunc

Func INIFILE()
   _Console("Die Datei reconnect.ini wurde nicht gefunden, Programm wird beendet.")
   TrayTip("Turbobaby's Reconnect " & $VERSION, _
   "A C H T U N G: reconnect.ini Datei nicht gefunden. Musterdatei wird erstellt und das Programm beendet.", 20, 1)
   $Text1 = '# Achtung: diese Datei kann gelöscht werden, wenn versehentlich zu viel experimentiert wurde.' _
   &@CRLF&'# Die Musterdatei wird dann automatisch neu erstellt.' _
   &@CRLF&'# Bitte passen sie die Einstellungen nach ihren Daten an.' _
   &@CRLF&@CRLF
   $Text2 = '[BOX]' _
   &@CRLF&'# Hier sind persönliche Dateien für die FritzBox.' _
   &@CRLF&'RouterIpTelefonie=192.168.177.1' _
   &@CRLF&'RouterIpInternetverbindung=192.168.177.100' _
   &@CRLF&'Benutzername=Max Mustermann' _
   &@CRLF&'Passwort=Test01' _
   &@CRLF&@CRLF
   $Text3 = '[LINKS]' _
   &@CRLF&'# Hier stehen die Links, wo auf der FritzBox zugegriffen wird.' _
   &@CRLF&'Telefonie=/login.lua?page=/home/home.lua' _
   &@CRLF&'NeuVerbinden=/login.lua?page=/internet/inetstat_monitor.lua' _
   &@CRLF&'UPNPVersuchen=JA' _
   &@CRLF&'NeuStartenLink=/login.lua?page=/system/reboot.lua' _
   &@CRLF&'NeuStarten=JA' _
   &@CRLF&@CRLF
   $Text4 = '[HTML]' _
   &@CRLF&'# Hier stehen die Wörter, wonach gesucht wird, bzw. wie die einzelnen Buttons und LogIn Felder heissen.' _
   &@CRLF&'VoipCheck=call_direction_' _
   &@CRLF&'LogInUserFeld=uiUser' _
   &@CRLF&'LogInPasswortFeld=uiPass' _
   &@CRLF&'LogInButtonID=uiSubmitLogin' _
   &@CRLF&'NeuVerbindenButton=Neu verbinden' _
   &@CRLF&'NeuVerbindenID=uiReconnectBtn' _
   &@CRLF&'NeuStartenButton=Neu starten' _
   &@CRLF&'NeuStartenName=reboot' _
   &@CRLF&@CRLF
   $Text5 = '[SONSTIGES]' _
   &@CRLF&'# Die Logdatei kann nur einmal erzeugt werden, danach wird der Wert automatisch auf NEIN gesetzt.' _
   &@CRLF&'# Die Datei dient rein für eine Fehleranalyse.' _
   &@CRLF&'# Diese Einstellung gehört zur BETA Phase, und wird in zukunft noch ausgebaut.' _
   &@CRLF&'# Zeitlimit in Sekunden einstellen z.B. 540 für 9 Minuten' _
   &@CRLF&'LogDateiErstellen=NEIN' _
   &@CRLF&'ToolTipsAnzeigen=AN' _
   &@CRLF&'Ton=AN' _
   &@CRLF&'VoipChecken=JA' _
   &@CRLF&'ShowScreen=NEIN' _
   &@CRLF&'ProgrammZeitlichBeenden=JA' _
   &@CRLF&'ZEITLIMIT=540' _
   &@CRLF&'ProgrammPausieren=JA' _
   &@CRLF&'PausenCountdown=10' _
   &@CRLF&@CRLF
   FileWrite(@scriptdir & '\reconnect.ini', $Text1 & $Text2 & $Text3 & $Text4 & $Text5)
   Sleep (10000)
   Exit
EndFunc

Func VOIPCHECK()
   do
      If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: " & $IPalt & _
         " - Neue IP: ?.?.?.?", "Achtung, zur Zeit werden noch Telefonate über die FritzBox geführt." , 20, 1)
         _IENavigate($oIE, "http://" & $FritzBox & $Telefonie)
         $oUser =_IEGetObjByName($oIE,$LogInUserFeld)
         $oPass =_IEGetObjByName($oIE,$LogInPasswortFeld)
         $oSubmit = _IEGetObjByID($oIE,$LogInButtonID)
         _IEFormElementSetValue ($oUser, $Benutzer)
         _IEFormElementSetValue ($oPass, $Passwort)
         _IEAction ($oSubmit, "click")
         _IELoadWait($oIE)
         $HTML = _IEDocReadHTML ($oIE)
         $ueberpruefen = StringInStr($HTML, $VoipCheck)
         _Console("Ausgabewert von der " & $FritzBox & ": " & $ueberpruefen)
         If $ProgrammZeitlichBeenden="JA" And TimerDiff($timerstart) > $ZEITLIMIT*1000 Then Call("ZEITLIMITEXIT")
         If $ueberpruefen > 0 Then Sleep (10000)
   until $ueberpruefen=0
EndFunc

 Func _WinAPI_PlaySound($sSound, $iFlags = 0x00020010, $hInstance = 0)
    Local $TypeOfSound = 'ptr'
    If $sSound Then
        If IsString($sSound) Then  $TypeOfSound = 'wstr'
    Else
        $sSound = 0
        $iFlags = 0
    EndIf
    Local $Ret = DllCall('winmm.dll', 'int', 'PlaySoundW', $TypeOfSound, $sSound, 'ptr', $hInstance, 'dword', $iFlags)
    If (@error) Or (Not $Ret[0]) Then Return SetError(1, 0, 0)
    Return 1
EndFunc   ;==>_WinAPI_PlaySound

Func Wave()
    Local $Wave
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= 'aDahNCczWjGtLxUuMyysKoAoKycSJcYjcSFaIPYd4hxKGnAZ9RY4FrYT+RJEELwPEQ2dDAEKrgnUBpoGSwMuA4r/hf9z+6L7Dvde90vyw/J27QnuKuj+6NHi3+NV3WXesNce2QLSk9OezE7OysfCyYnDjcXKvwPCc7yqvl+55rsgt4S5ObXSt8qzWLbUsom1MbKytGixNLQvscmzE7HPsx6xxrN4sR60DrK6tOSyf7Xxs3m2DrWktya2obhat9W527hCu1y6uLxxvMW+4b4TwWDBgcNbxGTGvMeryWzLKM2dz1TRw9M01dnXP9k03GfdfeCZ4ZXkeOXd6LDp9uye7SLxl/Ek9Y/16vgh+bP8x/xkAHIAKgTsA6gHegdoC+4KGA+xDvoSPhK0FvwVmRqoGToeNR3cIbggfSU3JA8ppSdILMsqYS+4LRIybTDgNAkzXjeLNQw6BjhMPEM6cj5ePDZAAz6lQWc/EEPaQF9E+EFERflCIUa4Q7hGYUR5R/hE3Ud8RW1I8kXVSFlGQ0naRqBJCEfbSWpHE0qURwhKfkeoSTBHVUnKRoxIJUakRzFFlkYmREJF9kK3Q2BBwEGPP30/UT0FPfc6UzpSOIo3pDVrNKsyhzHRL1guySwQK5wp9SePJrYkfSOdIXggiB59HYwboxqMGLIXcBW6FPkRVRFaDugNgwodCisGAga2AZABi/zE/FX3n/ek8Rvy4+uQ7Bfm+uZH4FXhtdoG3GrVzNZ00CXS7MumzcvHsckJxBvG1cD8wtm9GcBou8G9Sbmwu3+38Lk7tr+4PrXDt2y097bds222FrPAtaeyOLVEsuy0+bGetN+xl7Q8stC0nrJGtTezxLUTtLu2X7Xdt+22Y7kiuZO7bLu/vSG+Y8ARwS/DAMQHxinHHcnaypvMZs4s0ELSs9Mr1qTXGNph2+XdEd+m4bHiSuUw5gvp1On+7K3tGfGc8Uf1ivVX+bL5lv2c/dYBuwEfBvwFkAolCsIOQg7HEi0SqxbeFV8aiRkIHuschyFwIAolyCOOKDAn7CtrKjYvoS0/MoEwGzVdM5U3qDWmObM3qjuyOVo9LjvCPrE8CkDlPTZB4j7GQac/lUI/QDdD90DuQ6FB30R/QpxFOUP9RadDY0YCRFdG30McRs5D50V3Q11FFkNzRBdCRkP9QMFBgz/OP6s9pj2HO8o6yjgNOCI2FjVQM+cxHzBOLsEs6SpzKTMn6SXBI3siaCBnH2MdVhw9GmYZVhdvFg8UchPxEF8Qxw1EDUEK/wnUBoIG9QL8Arz+pP4R+lr67fRK9abvNPAo6tPqX+Rd5dDe7d8i2YPa6NNX1aPOZNAoyuLLtsW/x9nB6MM7vpTAUruHvYm4G7tctsC4X7TqtuKyfrX4saK0VLEGtFax5bMTsc+zKLHKs0yxCLTHsWW0IrLZtKiyMrVTs/y1L7S0tk+15Le+tjO5b7jYuqO6Er1IvW2/DcBUwjjDR8WxxqHIRcoYzEHOBdCZ0gfUstYo2CbbX9xc34DgX+NS5HnnWuh06x7sQe/g7z7zoPMq94P3Dvs0+wD/Df8VA+8C8QbOBgsLkQr0Dn0OtxIMEn4WyBVRGmMZ6B3sHIshYyAKJc0jXSgHJ8YrLCoTL5ctOjJ9MB81TDOqN8g10jnjN8U7rDl8PXU7KT8KPXRAMD6YQWs/okJfQGVDG0EtRM1Bw0SFQlBF50KqRWBDJka0Q0NG6UOJRhREuEZTRKFGO0RtRiREV0bqQ75FWkMQRctC8kOhQa5CbEARQd8+Qj8dPfc85jq6Oqs4ADgxNjY1ODMSMoAwIy90LeQrZCrEKGwnxCVpJIYiVyG0H6UeAR3xGzcabRnoFwgXWRWfFEASrRFeD8IOwwtwC/oHtgfdA6YDU/9s/7H62/rc9TP23PBS8YvrU+yD5knnOuFd4mbcjd2c1wzZHdOZ1MnOcNCWynXM88bQyKrD1cX3wPvClr7kwKW85b6/uh69Brlju2S3+bketoe4'
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= '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'
    $Wave &= 'wQGvAcUBqwHKAb4B0gG3AdIBxwHVAb4BxwG9AdoBvQHDAb0BxQG1AcUBuwHFAZ4BrQG3AaoBjQGYAYsBdwF3AWcBRgExATwBHgEDAeAA4AClAKUAcwBxAEEAPQD4//j/wv/G/57/rf9a/1z/N/8y/wD/Gv/M/tP+rP6s/nD+lf5w/l/+N/5W/gv+IP77/Q3+7/3//df98f3H/cn9u/3c/cv93P3D/dX90P3e/d398/3f/fj9B/4L/un9B/4f/iz+L/43/jX+Vv5u/mL+Zv6R/pb+n/68/sX+3v7Y/un+Dv8n/x3/XP9X/1j/cf+K/43/sP+r/7b/z//m/9//AQD2/wMAFAAzAC4AQQArAEkAXwB1AGkAkwCGAJwAmwC8ALQAtACjAM4A0gDOAM0A5gDVANsA3AD2AOAA2ADiAP0A5gDkAOIA+ADvAO4A5ADwAOwA9ADlAPQA9QDsAOIA3gDeAOoA0gDWANcA2wDNAMYAzwDMALoAxAC7AKcAqACoAJsAlwCbAHMAaQCDAIQAbQBxAHsAZgBRAFwAcQBcAFQAbQBPADIAVABYAD8APgBCAD0APQBFADMAHwAgADkAQwAoABkAHwAvAC4AIAAiACEAGwAtACsAMAAoACcALQAlADAAMAAWACMAOwA7AC0AIwAmADUALQA1ADUAIwArAFEAOQApAEcARwAiAD8AVABFADkATwBMADMANwBjAFgAOQA+AFEATgBFAD0ASwBDAEIATgBFAD4ASwBHAD0AMwBFAEUAJQAwAEsAPwAjAC0AQQA3ACkAIgAcAB8AHgAoADkAIgD+/xgALwATAP7/DQAjAA8A/P8LAAUA/v8TAAsA7//8//z//v/x//7/AwDi/97/+P/s/+f/4f/f/+z/6f/I/9v/0P/U/9r/z//S/+L/yv/A/8r/1v9yZWduXAAAAAEAAAAAAAAAAAAAKry4EsA6Ip9cAAAAAAAAAAC4EgAAAAAAAAAAAAAAAAAA6SzKMgAAAADpLMoyAAAAABJwb3B1cCBibG9ja2VyIDQxMGkAAAAAAAAu+Ob5LsQBb3Z3ZgQAAAAAAAAAdW1pZBgAAAAAAAAAAAAAKry4EsA6Ip9cAAAAAAAAAAA='
Return Binary(_Base64Decode($Wave))
EndFunc

Func _Base64Decode($input_string)
    Local $struct = DllStructCreate("int")
    Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", 0, "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(1, 0, "")
    Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", DllStructGetPtr($a), "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($a, 1)
EndFunc   ;==>_Base64Decode

Func reboot()
      If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: " & $IPalt & _
         " - Neue IP: ?.?.?.?", "Keine Telefonate! Der Router wird neu gestartet.", 20, 1)
         _IENavigate($oIE, "http://" & $FritzBox2 & $NeuStartenLink)
         $oUser =_IEGetObjByName($oIE,$LogInUserFeld)
         $oPass =_IEGetObjByName($oIE,$LogInPasswortFeld)
         $oSubmit = _IEGetObjByID($oIE,$LogInButtonID)
         _IEFormElementSetValue ($oUser, $Benutzer)
         _IEFormElementSetValue ($oPass, $Passwort)
         _IEAction ($oSubmit, "click")
         _IELoadWait($oIE)
         $HTML = _IEDocReadHTML ($oIE)
         $vorhanden = StringInStr($HTML,$NeuStartenButton)
         _Console('Das Wort "Neu starten" von dem Router ' & $FritzBox2 & ' steht auf der Stelle: ' & $vorhanden)
         $Button = _IEGetObjByName ($oIE,$NeuStartenName)
         _IEAction($Button,"click")
         _IELoadWait($oIE)
         sleep(24000)
         call("verbunden")
      EndFunc
      
Func verbunden()
   $verbunden=0
   For $i=5 To 1 Step -1
   If $verbunden=0 Then
         _IENavigate($oIE, "http://" & $FritzBox2 & $NeuVerbinden)
         $oUser =_IEGetObjByName($oIE,$LogInUserFeld)
         $oPass =_IEGetObjByName($oIE,$LogInPasswortFeld)
         $oSubmit = _IEGetObjByID($oIE,$LogInButtonID)
         _IEFormElementSetValue ($oUser, $Benutzer)
         _IEFormElementSetValue ($oPass, $Passwort)
         _IEAction ($oSubmit, "click")
         _IELoadWait($oIE)
         $HTML = _IEDocReadHTML ($oIE)
         $verbunden = StringInStr($HTML,'verbunden seit')
         _Console('Das Wort "Neu starten" von dem Router ' & $FritzBox2 & ' steht auf der Stelle: ' & $verbunden)
         _IELoadWait($oIE)
         sleep(24000)
   Else
   EndIf
   If $verbunden>0 then $i=0
   Next
EndFunc

Func _Console($_ConsoleText)
   ConsoleWrite($_ConsoleText &@CRLF)
      If $LogDateiErstellen='JA' or $LogDateiErstellen='YES' Then
         $_LogFile=FileOpen(@scriptdir&"\reconnect.log", 1)
         FileWrite(@scriptdir&"\reconnect.log",@CRLF&@MDAY&"."&@MON&"."&@YEAR&" - "&@HOUR&":"&@MIN&":"&@SEC&"          "&$_ConsoleText)
         FileClose($_LogFile)
      EndIf
EndFunc

Func Pause()
   If $ProgrammPausieren='JA' Then
         $Paused = NOT $Paused
      IF $Paused = True Then _Console("Programm wurde mit Pause-Taste pausiert")
      IF $Paused = False Then _Console("Programm wurde mit der Pause-Taste wieder aktiviert")
   While $Paused
        sleep(1000)
        If $ToolTipsAnzeigen="AN" Then TrayTip("Turbobaby's Reconnect. Alte IP: " & $IPalt & _
           " - Neue IP: ?.?.?.?", "Das Programm wurde mit der Pause-Taste pausiert!"& @CRLF &"Pause-Taste wieder drücken zum fortfahren.", 20, 1)
        If $ProgrammZeitlichBeenden="JA" And TimerDiff($timerstart) > $ZEITLIMIT*1000 Then Call("ZEITLIMITEXIT")
    WEnd
   EndIf
EndFunc   
   
Func Beenden()
      _Console("Programm wurde mit ESC beendet")
   Exit 0
EndFunc

Func EXITEVENT()
    Exit
 EndFunc

meine ini Datei sieht dann so aus:

# Achtung: diese Datei kann gelöscht werden, wenn versehentlich zu viel experimentiert wurde.
# Die Musterdatei wird dann automatisch neu erstellt.
# Bitte passen sie die Einstellungen nach ihren Daten an.

[BOX]
# Hier sind persönliche Dateien für die FritzBox.
RouterIpTelefonie=192.168.177.1
RouterIpInternetverbindung=192.168.177.100
Benutzername=Max Mustermann
Passwort=Test01

[LINKS]
# Hier stehen die Links, wo auf der FritzBox zugegriffen wird.
Telefonie=/login.lua?page=/home/home.lua
NeuVerbinden=/login.lua?page=/internet/inetstat_monitor.lua
UPNPVersuchen=JA
NeuStartenLink=/login.lua?page=/system/reboot.lua
NeuStarten=JA

[HTML]
# Hier stehen die Wörter, wonach gesucht wird, bzw. wie die einzelnen Buttons und LogIn Felder heissen.
VoipCheck=call_direction_
LogInUserFeld=uiUser
LogInPasswortFeld=uiPass
LogInButtonID=uiSubmitLogin
NeuVerbindenButton=Neu verbinden
NeuVerbindenID=uiReconnectBtn
NeuStartenButton=Neu starten
NeuStartenName=reboot

[SONSTIGES]
# Die Logdatei kann nur einmal erzeugt werden, danach wird der Wert automatisch auf NEIN gesetzt.
# Die Datei dient rein für eine Fehleranalyse.
# Diese Einstellung gehört zur BETA Phase, und wird in zukunft noch ausgebaut.
# Zeitlimit in Sekunden einstellen z.B. 540 für 9 Minuten
LogDateiErstellen=NEIN
ToolTipsAnzeigen=AN
Ton=AN
VoipChecken=JA
ShowScreen=NEIN
ProgrammZeitlichBeenden=JA
ZEITLIMIT=540
ProgrammPausieren=JA
PausenCountdown=10

Jetzt würde ich gerne, wenn da keine ini Datei vorhanden ist, eine Standard Datei benutzen mit standartwerten

Aber wie kann ich in diesem Fall die Datei Binär auslesen und den Befehlen zuordnen?

Ist so was überhaupt mit diesem hier angebotenem Code möglich?

Es soll jetzt nur ein Beispiel sein, denn ich möchte den Ablauf versuchen zu verstehen

Link to comment
Share on other sites

  • Moderators

turbobaby,

Please post in English - my rusty German can just about get the gist of all that, but we prefer it if everyone can read and understand. ;)

You say you tap in thousands of numbers each day - why do you need to store them? Are the tasks repetitive to that extent? :huh:

Please understand that I am trying my best to allow this discussion to continue so any help you can offer as to why you want to trap keystrokes is in your own best interests. ;)

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

the numbers i type is not relevant

i want only for research to find out, how many numbers i type in a day in a week and in month.

and how i just wrote, i find this code on Internet, but this is only incidental.

i want generally to find out how can i use an ini or a txt file in the same code

if i try to reprogram the example wave code, than it make a mistake

example:

i have an in file as follows

 

[name]
Name=John
LastName=Miller

[residence]
Place=Berlin
PostalCode=01234
Street=Hamingway 4

How can i read the Words, if this ini file is in the same Code included?

Link to comment
Share on other sites

As posted in post #96 you have to extract the binary string first:

<snip>

Br,

UEZ

Edited by Melba23
Code removed

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...