Sign in to follow this  
Followers 0
DXRW4E

_RegEnumKeyValEx (_RegEnumKeyEx & _RegEnumValEx)

16 posts in this topic

#1 ·  Posted (edited)

Hi All, Sorry for my English

I searched the forum a function like that, and not found, indeed, there are many topics request regarding all this function, and I have done this, I did not know what name to put them RegEnumKeyToArray or RegListToArray or ect ect in the end I chose _RegEnumKeyValEx (_RegEnumKeyEx & _RegEnumValEx), the function does almost everything (also includes $sFilter as the >_FileListToArrayEx), and works really fast too

 

#include-once

; #UDF# =======================================================================================================================
; Title .........: Reads\Search the name of a Key\Subkey\Value
; AutoIt Version : 3.3.8.1
; Language ......: English
; Description ...: Lists all Keys\Subkeys\Values in a specified registry key
; Author(s) .....: DXRW4E
; Notes .........:
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
;~ _RegEnumKeyEx
;~ _RegEnumValEx
; ===============================================================================================================================

#Region ;**** Global constants and vars ****
Global Const $sValueTypes[12] = ["REG_NONE","REG_SZ","REG_EXPAND_SZ","REG_BINARY","REG_DWORD","REG_DWORD_BIG_ENDIAN","REG_LINK","REG_MULTI_SZ","REG_RESOURCE_LIST","REG_FULL_RESOURCE_DESCRIPTOR","REG_RESOURCE_REQUIREMENTS_LIST","REG_QWORD"]
#EndRegion ;**** Global constants and vars ****

; #FUNCTION# ========================================================================================================================
; Name...........: _RegEnumKeyEx
; Description ...: Lists all subkeys in a specified registry key
; Syntax.........: _RegEnumKeyEx($KeyName[, $iFlag = 0[, $sFilter = "*"]])
; Parameters ....: $KeyName - The registry key to read.
;                 $iFlag   - Optional specifies Recursion (add the flags together for multiple operations):
;                 |$iFlag = 0 (Default) All Key-SubKeys Recursive Mod
;                 |$iFlag = 1 All SubKeys Not Recursive Mod
;                 |$iFlag = 2 Include in ArrayList in the first element $KeyName
;                 |$iFlag = 16 $sFilter do Case-Sensitive matching (By Default $sFilter do Case-Insensitive matching)
;                 |$iFlag = 32 Disable the return the count in the first element - effectively makes the array 0-based (must use UBound() to get the size in this case).
;                   By Default the first element ($array[0]) contains the number of strings returned, the remaining elements ($array[1], $array[2], etc.)
;                 |$iFlag = 64 $sFilter is REGEXP Mod, See Pattern Parameters in StringRegExp
;                 |$iFlag = 128 Enum value's name (_RegEnumKeyEx Return a 2D array, maximum Array Size limit is 3999744 Key\Value)
;                 |$iFlag = 256 Reads a value data, this flag will be ignored if the $iFlag = 128 is not set
;                 $sFilter - Optional the filter to use, default is *. (Multiple filter groups such as "All "*.XXx|*.YYY|*.ZZZ")
;                  Search the Autoit3 helpfile for the word "WildCards" For details.
;                 $vFilter - Optional the filter to use for ValueName, $vFilter will be ignored if the $iFlag = 128 is not set
;                  default is *. (Multiple filter groups such as "All "*.XXx|*.YYY|*.ZZZ") Search the Autoit3 helpfile for the word "WildCards" For details.
;                 $iValueTypes - Optional, set Value Types to search (Default $iValueTypes = 0 Read All), $iValueTypes will be ignored if the $iFlag = 128 is not set
;                   (add the flags together for multiple operations):
;                   1 = REG_SZ
;                   2 = REG_EXPAND_SZ
;                   3 = REG_BINARY
;                   4 = REG_DWORD
;                   5 = REG_DWORD_BIG_ENDIAN
;                   6 = REG_LINK
;                   7 = REG_MULTI_SZ
;                   8 = REG_RESOURCE_LIST
;                   9 = REG_FULL_RESOURCE_DESCRIPTOR
;                   10 = REG_RESOURCE_REQUIREMENTS_LIST
;                   11 = REG_QWORD
; Return values .: Success  - Return Array List (See Remarks)
;                 Failure - @Error
;                 |1 = Invalid $sFilter
;                 |2 = No Key-SubKey(s) Found
;                 |3 = Invalid $vFilter
;                 |4 = No Value-Name(s) Found
; Author ........: DXRW4E
; Modified.......:
; Remarks .......: The array returned is one-dimensional and is made up as follows:
;                               $array[0] = Number of Key-SubKeys returned
;                               $array[1] = 1st Key\SubKeys
;                               $array[2] = 2nd Key\SubKeys
;                               $array[3] = 3rd Key\SubKeys
;                               $array[n] = nth Key\SubKeys
;
;                 If is set the $iFlag = 128 The array returned is 2D array and is made up as follows:
;                               $array[0][0] = Number of Key-SubKeys returned
;                               $array[1][0] = 1st Key\SubKeys
;                               $array[1][1] = 1st Value name
;                               $array[1][2] = 1st Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect)
;                               $array[1][3] = 1st Value Data (If is set $iFlag = 256 Else Value Data = "")
;                               $array[2][0] = 2nd Key\SubKeys
;                               $array[2][1] = 2nd Value name
;                               $array[2][2] = 2nd Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect)
;                               $array[2][3] = 2nd Value Data (If is set $iFlag = 256 Else Value Data = "")
;                               $array[n][0] = nth Key\SubKeys
; Related .......: _RegEnumValEx()
; Link ..........:
; Example .......: _RegEnumKeyEx("HKEY_CURRENT_USER\Software\AutoIt v3")
; Note ..........:
; ===================================================================================================================================
Func _RegEnumKeyEx($KeyName, $iFlag = 0, $sFilter = "*", $vFilter = "*", $iValueTypes = 0)
    If StringRegExp($sFilter, StringReplace("^\s*$|\v|\\|^\||\|\||\|$", Chr(BitAND($iFlag, 64) + 28) & "\|^\||\|\||\|$", "\\\\")) Then Return SetError(1, 0, "")
    Local $IndexSubKey[101] = [100], $SubKeyName, $BS = "\", $sKeyList, $I = 1, $sKeyFlag = BitAND($iFlag, 1), $sKeyFilter = StringReplace($sFilter, "*", "")
    If BitAND($iFlag, 2) Then $sKeyList = @LF & $KeyName
    If Not BitAND($iFlag, 64) Then $sFilter = StringRegExpReplace(BitAND($iFlag, 16) & "(?i)(", "16\(\?\i\)|\d+", "") & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($sFilter, "[^*?|]+", "\\Q$0\\E"), "\\E(?=\||$)", "$0\$"), "(?<=^|\|)\\Q", "^$0"), "\*+", ".*") & ")"
    While $I
        $IndexSubKey[$I] += 1
        $SubKeyName = RegEnumKey($KeyName, $IndexSubKey[$I])
        If @error Then
            $IndexSubKey[$I] = 0
            $I -= 1
            $KeyName = StringLeft($KeyName, StringInStr($KeyName, "\", 1, -1) - 1)
            ContinueLoop
        EndIf
        If $sKeyFilter Then
            If StringRegExp($SubKeyName, $sFilter) Then $sKeyList &= @LF & $KeyName & $BS & $SubKeyName
        Else
            $sKeyList &= @LF & $KeyName & $BS & $SubKeyName
        EndIf
        If $sKeyFlag Then ContinueLoop
        $I += 1
        If $I > $IndexSubKey[0] Then
            $IndexSubKey[0] += 100
            ReDim $IndexSubKey[$IndexSubKey[0] + 1]
        EndIf
        $KeyName &= $BS & $SubKeyName
    WEnd
    If Not $sKeyList Then Return SetError(2, 0, "")
    If BitAND($iFlag, 128) <> 128 Then Return StringSplit(StringTrimLeft($sKeyList, 1), @LF, StringReplace(BitAND($iFlag, 32), "32", 2))
    $sKeyList = _RegEnumValEx(StringSplit(StringTrimLeft($sKeyList, 1), @LF), $iFlag, $vFilter, $iValueTypes)
    Return SetError(@Error, 0, $sKeyList)
EndFunc


; #FUNCTION# ========================================================================================================================
; Name...........: _RegEnumValEx
; Description ...: Lists all values in a specified registry key
; Syntax.........: _RegEnumValEx($KeyName[, $iFlag = 0[, $sFilter = "*"]])
; Parameters ....: $KeyName - The registry key to read Or one-dimensional array RegKeyList
;                   use _RegEnumKeyEx() to get $RegKeyList (example $RegKeyList = [3, 1st Key\SubKeys, 2st Key\SubKeys, nth Key\SubKeys])
;                 |$iFlag = 16 $sFilter do Case-Sensitive matching (By Default $sFilter do Case-Insensitive matching)
;                 |$iFlag = 32 Disable the return the count in the first element - effectively makes the array 0-based (must use UBound() to get the size in this case).
;                   By Default the first element ($array[0]) contains the number of strings returned, the remaining elements ($array[1], $array[2], etc.)
;                 |$iFlag = 64 $sFilter is REGEXP Mod, See Pattern Parameters in StringRegExp
;                 |$iFlag = 256 Reads a value data
;                 $sFilter - Optional the filter to use, default is *. (Multiple filter groups such as "All "*.XXx|*.YYY|*.ZZZ")
;                  Search the Autoit3 helpfile for the word "WildCards" For details.
;                 $iValueTypes - Optional, set Value Types to search (Default $iValueTypes = 0 Read All)
;                   (add the flags together for multiple operations):
;                   1 = REG_SZ
;                   2 = REG_EXPAND_SZ
;                   3 = REG_BINARY
;                   4 = REG_DWORD
;                   5 = REG_DWORD_BIG_ENDIAN
;                   6 = REG_LINK
;                   7 = REG_MULTI_SZ
;                   8 = REG_RESOURCE_LIST
;                   9 = REG_FULL_RESOURCE_DESCRIPTOR
;                   10 = REG_RESOURCE_REQUIREMENTS_LIST
;                   11 = REG_QWORD
; Return values .: Success  - Return Array List (See Remarks)
;                 Failure - @Error
;                 |3 = Invalid $sFilter
;                 |4 = No Value-Name(s) Found
; Author ........: DXRW4E
; Modified.......:
; Remarks .......: The array returned is 2D array and is made up as follows:
;                               $array[0][0] = Number of Key-SubKeys returned
;                               $array[1][0] = 1st Key\SubKeys
;                               $array[1][1] = 1st Value name
;                               $array[1][2] = 1st Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect)
;                               $array[1][3] = 1st Value Data (If is set $iFlag = 256 Else Value Data = "")
;                               $array[2][0] = 2nd Key\SubKeys
;                               $array[2][1] = 2nd Value name
;                               $array[2][2] = 2nd Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect)
;                               $array[2][3] = 2nd Value Data (If is set $iFlag = 256 Else Value Data = "")
;                               $array[n][0] = nth Key\SubKeys
; Related .......: _RegEnumKeyEx()
; Link ..........:
; Example .......: _RegEnumValEx("HKEY_CURRENT_USER\Software\AutoIt v3")
; Note ..........:
; ===================================================================================================================================
Func _RegEnumValEx($aKeyList, $iFlag = 0, $sFilter = "*", $iValueTypes = 0)
    If StringRegExp($sFilter, "\v") Then Return SetError(3, 0, "")
    If Not IsArray($aKeyList) Then $aKeyList = StringSplit($aKeyList, @LF)
    Local $aKeyValList[1954][4], $iKeyVal = Int(BitAND($iFlag, 32) = 0), $sKeyVal = 1953, $sRegEnumVal, $iRegEnumVal, $RegRead = BitAND($iFlag, 256), $vFilter = StringReplace($sFilter, "*", "")
    If Not BitAND($iFlag, 64) Then $sFilter = StringRegExpReplace(BitAND($iFlag, 16) & "(?i)(", "16\(\?\i\)|\d+", "") & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($sFilter, "[^*?|]+", "\\Q$0\\E"), "\\E(?=\||$)", "$0\$"), "(?<=^|\|)\\Q", "^$0"), "\*+", ".*") & ")"
    For $i = 1 To $aKeyList[0]
        $iRegEnumVal = 0
        While 1
            If $iKeyVal = $sKeyVal Then
                If $sKeyVal = 3999744 Then ExitLoop
                $sKeyVal *= 2
                ReDim $aKeyValList[$sKeyVal + 1][4]
            EndIf
            $aKeyValList[$iKeyVal][0] = $aKeyList[$i]
            $iRegEnumVal += 1
            $sRegEnumVal = RegEnumVal($aKeyList[$i], $iRegEnumVal)
            If @Error <> 0 Then
                If $iRegEnumVal = 1 And $vFilter = "" Then $iKeyVal += 1
                ExitLoop
            EndIf
            $aKeyValList[$iKeyVal][2] = $sValueTypes[@Extended]
            If BitAND(@Extended, $iValueTypes) <> $iValueTypes Then ContinueLoop
            If $vFilter And Not StringRegExp($sRegEnumVal, $sFilter) Then ContinueLoop
            $aKeyValList[$iKeyVal][1] = $sRegEnumVal
            If $RegRead Then $aKeyValList[$iKeyVal][3] = RegRead($aKeyList[$i], $sRegEnumVal)
            $iKeyVal += 1
        WEnd
    Next
    $sRegEnumVal = $iKeyVal - Int(BitAND($iFlag, 32) = 0)
    If Not $sRegEnumVal Or ($sRegEnumVal = 1 And $vFilter = "" And $aKeyValList[$iKeyVal - $sRegEnumVal][2] = "") Then Return SetError(4, 0, "")
    ReDim $aKeyValList[$iKeyVal][4]
    If Not BitAND($iFlag, 32) Then $aKeyValList[0][0] = $iKeyVal - 1
    Return $aKeyValList
EndFunc

example

#RequireAdmin
#include <_RegEnumKeyValEx.au3>
#include <Array.au3>

Global $a, $t, $Error, $Extended, $KeyName
;$KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft"
;$KeyName = "HKEY_CLASSES_ROOT"    ;104718
;$KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes"
$KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3"

$t = TimerInit()
;$a = _RegEnumKeyEx($KeyName, 0,  "Opti*Components")    ; to find HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OptionalComponents
;$a = _RegEnumKeyEx($KeyName, 0,  "*")
$a = _RegEnumKeyEx($KeyName,  128 + 256 + 32 + 16,  "*", "*vers*")
$Error = @Error
$Extended = @Extended
$t = TimerDiff($t)
ConsoleWrite("Timer = " & $t & @LF)
ConsoleWrite("Return = " & $a & " - $Error = " & $Error & " - $Extended = " & $Extended & @LF)
_ArrayDisplay($a)

;or
$a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256)
;Return 2D array all Keys\Subkes\Values ect ect
_ArrayDisplay($a)

$a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256, "*","*Ver*on*")
;Return $a[2][4] = [[1],["HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt","Version","REG_SZ","v3.3.8.1"]]
_ArrayDisplay($a)

$a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256 + 32, "*","*ver*on*")
;Return $a[1][4] = [["HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt","Version","REG_SZ","v3.3.8.1"]]
_ArrayDisplay($a)

$a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256 + 16, "*","*ver*on*")
;Return @Error = 4 ($iFlag = 16 $sFilter do Case-Sensitive matching, Version <> version)
;_ArrayDisplay($a)

$a = _RegEnumValEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", 256,"*Ver*on*")
;Return $a[2][4] = [[1],["HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt","Version","REG_SZ","v3.3.8.1"]]
_ArrayDisplay($a)

_RegEnumKeyValEx.au3

Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites



DXRW4W,

really nice - thanks for sharing! :)

Share this post


Link to post
Share on other sites

Updated, Added $sFilter Case-sensitivity flag & Disable the return the count in the first element, for more see the first post

Ciao.


apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

This is so awesome! What are the chances, because I have been trying to figure this out all day yesterday and now you've come along and made my life a million times easier!

Thank you!

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

@jazzyjeff

Thank You, You are welcome

@All

Updated, add $iFlag = 64 now you can use the $sFilter in RegExp Mod (See Pattern Parameters in StringRegExp )

Ciao.

Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

DXRW4E

Is there any chance you could add an option to return all sub values as well into a 2d array?

This would make this function perfect!

Share this post


Link to post
Share on other sites

already done

Ciao.


apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

Updated, add flags $iValueTypes

Ciao.


apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

#10 ·  Posted (edited)

Thank you for the great script.

I have added to your example:

#include <_RegEnumKeyValEx.au3>

I have changed in your example line 19:

From:

_ArrayDisplay($a, $a1)

To

_ArrayDisplay($a)
 

Thank you,

Docfxit

Edited by Docfxit

Share this post


Link to post
Share on other sites

Hi Docfxit, Thank you for reporting, already editupdated the example script

Ciao.


apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

#12 ·  Posted (edited)

Ive been working with this for uninstall keys and i wondered is there any way to have it show the ProgramName & InstallLocation keys in the array with the search?

because often they are msi uninstallers so i cant tell what they are for?

Code Im using

#RequireAdmin
#include <_RegEnumKeyValEx.au3>
#include <Array.au3>
Opt("TrayAutoPause",0)

Global $UninstallList
$sRegPath = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKCU64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'
;~ =================================================
Global $aRegPath = StringSplit($sRegPath, "|")
;~ _ArrayDisplay( $aRegPath)
;~ =================================================

Global $UninstallCheck, $UninstallKeys[0][4]
For $regloop = 1 To $aRegPath[0]
    If IsArray($aRegPath) Then
        $UninstallCheck = _RegEnumKeyEx($aRegPath[$regloop], 128 + 256, "*","*UninstallS*") ;*UninstallS*
        ConsoleWrite('UninstallCheck Is Array & @error = ' & @error & @CRLF)
;~         _ArrayDisplay($UninstallCheck, "To concatenate", Default, 8)
        _ArrayConcatenate($UninstallKeys, $UninstallCheck, 1) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        ConsoleWrite('UninstallArray & @error = ' & @error & @CRLF)
;~         _ArrayDisplay($UninstallKeys, "Concatenated", Default, 8)
    Else
        ConsoleWrite('UninstallCheck Not Array ' & @CRLF)
        ContinueLoop
    EndIf
Next
        _ArrayDisplay($UninstallKeys, "Concatenated", Default, 8)

This shows me all the uninstallers but not what they belong to

Suggestions?

Edited by Chimaera

Share this post


Link to post
Share on other sites

#13 ·  Posted (edited)

Hi Chimaera, we are offtopic because this is not about the RegEnumKeyEx, but the msi setup http://technet.microsoft.com/en-us/library/bb892810.aspx

however here

#RequireAdmin
#include <_RegEnumKeyValEx.au3>
#include <Array.au3>

Global Const $sPatternGUID = "\{?(.)(.)(.)(.)(.)(.)(.)(.)-?(.)(.)(.)(.)-?(.)(.)(.)(.)-?(.)(.)(.)(.)-?(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\}?"
Global Const $sComponentIdPattern  = "$8$7$6$5$4$3$2$1$12$11$10$9$16$15$14$13$18$17$20$19$22$21$24$23$26$25$28$27$30$29$32$31"
;;Global Const $scGUIDPattern = "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)"
Global Const $sGUIDPattern  = "{$8$7$6$5$4$3$2$1-$12$11$10$9-$16$15$14$13-$18$17$20$19-$22$21$24$23$26$25$28$27$30$29$32$31}"

; #FUNCTION# =======================================================================================================================================================
; Name...........: _GetCompressedGUID
; Description ...: Connvert String GUID to String Compressed GUID
; Syntax.........: _GetCompressedGUID($sGUID[, $iFlags])
; Parameters ....: $sGUID - String GUID
;                  $iFlags - Optional, (Default = 0), if $iFlags $sGUID must be contain String Compressed GUID
; Return values .: String Product Properties, and set error
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:
; ==================================================================================================================================================================
Func _GetCompressedGUID($sGUID, $iFlags = 0)
    Return StringRegExpReplace($sGUID, $sPatternGUID, ($iFlags ? $sGUIDPattern : $sComponentIdPattern))
EndFunc


Global $aUninstallCheck, $aKeyList[1] = [0], $aMsiPath, $sMsiPath = "HKLM\SOFTWARE\Classes\Installer\Products\"
Global $aRegPath = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKCU64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'
$aRegPath = StringSplit($aRegPath, "|")

For $i = 1 To $aRegPath[0]
    $aRegEnumKeyEx = _RegEnumKeyEx($aRegPath[$i], 256, "*","*") ;*UninstallS*
    If Not @Error Then
        ReDim $aKeyList[$aKeyList[0] + $aRegEnumKeyEx[0] + 1]
        For $y = 1 To $aRegEnumKeyEx[0]
            $aKeyList[$y + $aKeyList[0]] = $aRegEnumKeyEx[$y]
        Next
        $aKeyList[0] += $aRegEnumKeyEx[0]
    EndIf
Next
If $aKeyList[0] Then
    ;;_RegEnumValEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", 256,"*Ver*on*") or _RegEnumValEx($aKey, 256,"*Ver*on*")
    $aUninstallCheck = _RegEnumValEx($aKeyList, 256, "*UninstallS*")
    If Not @Error Then
        For $i = 1 To $aUninstallCheck[0][0]
            $aMsiPath = StringRegExp($aUninstallCheck[$i][3], "^(?i)\h*MsiExec.exe\h+/\w\h*(\{[^\}]+\})", 1)
            If @Error then ContinueLoop
            ; Example
            ;; Example $DotNet4 = "HKLM\SOFTWARE\Classes\Installer\Products\%NetFX_Client_InstallerCode%"
            ;;RegRead($DotNet4, "AdvertiseFlags") - > %REG_DWORD%,"388"
            ;;RegRead($DotNet4, "Assignment") - > %REG_DWORD%,"1"
            ;;RegRead($DotNet4, "AuthorizedLUAApp") - > %REG_DWORD%,"0"
            ;;RegRead($DotNet4, "Clients") - > %REG_MULTI_SZ%,":"
            ;;RegRead($DotNet4, "InstanceType") - > %REG_DWORD%,"0"
            ;;RegRead($DotNet4, "Language") - > %REG_DWORD%,"0"
            ;;RegRead($DotNet4, "PackageCode") - > %REG_SZ%,"%NetFX_Client_PackageCode%"
            ;;RegRead($DotNet4, "ProductName", ,"%CoreProductName%"
            ;;RegRead($DotNet4, "Version") - > %REG_DWORD%,"67139183"
            ;;RegRead($DotNet4 & "\SourceList", "LastUsedSource") - > %REG_EXPAND_SZ%,"n;1;%SystemRoot%\Windows\Installer\"
            ;;RegRead($DotNet4 & "\SourceList", "PackageName") - > "netfx_Core_x86.msi"
            ;;RegRead($DotNet4 & "\SourceList\Media" ,"1") -> REG_SZ%";1"
            ;;RegRead($DotNet4 & "\SourceList\Net" ,"1") - > %REG_EXPAND_SZ%,"%SystemRoot%\Windows\Installer\"
            ;
            $aUninstallCheck[$i][3] &= @LF & RegRead($sMsiPath & _GetCompressedGUID($aMsiPath[0]) & "\SourceList", "PackageName")
            $aUninstallCheck[$i][3] &= @LF & StringRegExpReplace(RegRead($sMsiPath & _GetCompressedGUID($aMsiPath[0]) & "\SourceList", "LastUsedSource"), "^.*;(?=\w)", "")
            ;
            ;;$aTemp =  _RegEnumKeyEx($sMsiPath & _GetCompressedGUID($aMsiPath[0]), 128 + 256, "*","*")
            ;;If Not @Error Then
            ;;  $aTemp[0][1] = $aUninstallCheck[$i][3]
            ;;  $aUninstallCheck[$i][3] = $aTemp
            ;;EndIf
            ;;;; _ArrayDisplay($aUninstallCheck[$i][3])
        Next
    EndIf
EndIf
_ArrayDisplay($aUninstallCheck)

;~ For $i = 1 To $aUninstallCheck[0][0]
;~  If IsArray($aUninstallCheck[$i][3]) Then
;~      ;;msi mod
;~      $sUinstallComand = ($aUninstallCheck[$i][3])[0][1]
;~  Else
;~      ;;
;~  EndIf
;~ Next

Ciao.

Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

#15 ·  Posted (edited)

@OffTopic

Thats amazing i didnt even know they could be deciphered like that

Windows Installer GUID Compressed GUID

look also Darwin Descriptors

#Region ;Encoding-Decoding Base85

;; tables for encoding and decoding base85
Global Const $aTable_Dec85[0x80] = [ _
    0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, _
    0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, _
    0xff,0x00,0xff,0xff,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0xff, _
    0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0xff,0xff,0xff,0x16,0xff,0x17, _
    0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, _
    0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0xff,0x34,0x35,0x36, _
    0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46, _
    0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0xff,0x53,0x54,0xff]
Global Const $aTable_Enc85[85] = [ _
    "!","$","%","&","'","(",")","*","+",",","-",".","0","1","2","3","4","5","6","7","8", _
    "9","=","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q", _
    "R","S","T","U","V","W","X","Y","Z","[","]","^","_","`","a","b","c","d","e","f","g", _
    "h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","}","~"]


; #FUNCTION# =======================================================================================================================================================
; Name...........: _Decode_Base85_GUID
; Description ...: Converts a (base85 encoded GUID) Darwin Descriptor into a StringGUID, String Base85 encoded GUIDs should be 20 characters long.
; Syntax.........: _Decode_Base85_GUID($sDarwinDes)
; Parameters ....: $sDarwinDes   - String (base85 encoded) Darwin Descriptor
; Return values .: If the function succeeds, return StringGUID. If the function fails, return False
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:  This function was inspired by ReactOS Project
;                   http://www.reactos.org/
;                  * Copyright 2002-2005 Mike McCormack for CodeWeavers
;                  * Copyright 2005 Aric Stewart for CodeWeavers
; ==================================================================================================================================================================
Func _Decode_Base85_GUID($sDarwinDes)
    Local $dData = 0, $dBase = 1, $tGUID = DllStructCreate("struct; ulong Data1;ulong Data2;ulong Data3;ulong Data4;endstruct")
    If StringLen($sDarwinDes) < 20 Then Return SetError(1, 0, False)
    $sDarwinDes = StringToASCIIArray($sDarwinDes)
    For $i = 0 to 19 Step 5
        $dData = 0
        $dBase = 1
        For $y = $i To $i + 4
            $dData += $aTable_Dec85[$sDarwinDes[$y]] * $dBase
            If $sDarwinDes[$y] >= 0x80 Then Return SetError(2, 0, False)
            If $sDarwinDes[$y] = 0xff Then Return SetError(3, 0, False)
            $dBase *= 85
        Next
        DllStructSetData($tGUID, Round($i/5) + 1, $dData)
    Next
    Local $aResult = DllCall("ole32.dll", "int", "StringFromGUID2", "struct*", $tGUID, "wstr", "", "int", 40)
    If @Error Or Not $aResult[0] Then Return SetError(@error, @extended, False)
    Return $aResult[2]
EndFunc


; #FUNCTION# =======================================================================================================================================================
; Name...........: _Decode_Base85_GUIDEx
; Description ...: Converts a (base85 encoded GUID) Darwin Descriptor into a StringGUID, String Base85 encoded GUIDs should be 20 characters long.
; Syntax.........: _Decode_Base85_GUID($sDarwinDes)
; Parameters ....: $sDarwinDes   - String (base85 encoded) Darwin Descriptor
; Return values .: If the function succeeds, return StringGUID. If the function fails, return False
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:  This function was inspired by ReactOS Project
;                   http://www.reactos.org/
;                  * Copyright 2002-2005 Mike McCormack for CodeWeavers
;                  * Copyright 2005 Aric Stewart for CodeWeavers
; ==================================================================================================================================================================
Func _Decode_Base85_GUIDEx($sDarwinDes)
    Local $dData = 0, $dBase = 1, $aGUID[5]
    If StringLen($sDarwinDes) < 20 Then Return SetError(1, 0, False)
    $sDarwinDes = StringToASCIIArray($sDarwinDes)
    For $i = 0 to 19 Step 5
        $dData = 0
        $dBase = 1
        For $y = $i To $i + 4
            $dData += $aTable_Dec85[$sDarwinDes[$y]] * $dBase
            If $sDarwinDes[$y] >= 0x80 Then Return SetError(2, 0, False)
            If $sDarwinDes[$y] = 0xff Then Return SetError(3, 0, False)
            $dBase *= 85
        Next
        $aGUID[$i/5] = $dData
        $aGUID[4] &= Hex($dData, 8)
    Next
    Return StringRegExpReplace($aGUID[4], "(.{8})(.{4})(.{4})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})",  "{$1-$3-$2-$7$6-$5$4$11$10$9$8}")
EndFunc


; #FUNCTION# =======================================================================================================================================================
; Name...........: _Encode_Base85_GUID
; Description ...: Converts a StringGUID into a String (base85 encoded) Darwin Descriptor
; Syntax.........: _Encode_Base85_GUID($sGUID)
; Parameters ....: $sGUID        - String GUID
; Return values .: If the function succeeds, return String (base85 encoded) Darwin Descriptor. If the function fails, return False
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:  This function was inspired by ReactOS Project
;                   http://www.reactos.org/
;                  * Copyright 2002-2005 Mike McCormack for CodeWeavers
;                  * Copyright 2005 Aric Stewart for CodeWeavers
; ==================================================================================================================================================================
Func _Encode_Base85_GUID($sGUID)
    Local $sDD_GUID, $dData, $tGUID = DllStructCreate("struct; ulong Data1;ulong Data2;ulong Data3;ulong Data4;endstruct")
    Local $aResult = DllCall("ole32.dll", "long", "CLSIDFromString", "wstr", $sGUID, "struct*", $tGUID)
    If @Error Then Return SetError(@error, @extended, False)
    ;;Local $sDD_GUID, $dData, $tGUID = DllStructCreate("struct; ulong Data1;ushort Data2;ushort Data3;byte Data4[8]; endstruct")
    ;;Local $aResult = DllCall("ole32.dll", "long", "CLSIDFromString", "wstr", $sGUID, "struct*", $tGUID)
    ;;If @Error Then Return SetError(@error, @extended, False)
    ;;$tGUID = DllStructCreate("ulong Data1;ulong Data2;ulong Data3;ulong Data4", DllStructGetPtr($tGUID))
    For $i = 1 to 4
        $dData = DllStructGetData($tGUID, $i)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
    Next
    Return $sDD_GUID
EndFunc


; #FUNCTION# =======================================================================================================================================================
; Name...........: _Encode_Base85_GUIDEx
; Description ...: Converts a StringGUID into a String (base85 encoded) Darwin Descriptor
; Syntax.........: _Encode_Base85_GUIDEx($sGUID)
; Parameters ....: $sGUID        - String GUID
; Return values .: If the function succeeds, return String (base85 encoded) Darwin Descriptor. If the function fails, return False
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:  This function was inspired by ReactOS Project
;                   http://www.reactos.org/
;                  * Copyright 2002-2005 Mike McCormack for CodeWeavers
;                  * Copyright 2005 Aric Stewart for CodeWeavers
; ==================================================================================================================================================================
Func _Encode_Base85_GUIDEx($sGUID)
    Local $sDD_GUID, $dData, $aGUID = StringRegExp($sGUID, "\{?([0-9A-Fa-f]{8})-?([0-9A-Fa-f]{4})-?([0-9A-Fa-f]{4})-?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})-?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})", 1)
    If @Error Then Return SetError(@error, @extended, False)
    $aGUID[0] = Number("0x" & $aGUID[0], 3)
    $aGUID[1] = Number("0x" & $aGUID[2] & $aGUID[1], 3)
    $aGUID[2] = Number("0x" & $aGUID[6] & $aGUID[5] & $aGUID[4] & $aGUID[3], 3)
    $aGUID[3] = Number("0x" & $aGUID[10] & $aGUID[9] & $aGUID[8] & $aGUID[7], 3)
    For $i = 0 to 3
        $dData = $aGUID[$i]
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
    Next
    Return $sDD_GUID
EndFunc


#EndRegion ;Encoding-Decoding Base85
Ciao. Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites

#16 ·  Posted (edited)

@DXRW4E Is it possible to return only if the Default valuename contains ValueData?  I tried with setting the $sFilter to "" and using "*" but both return all Values in the path. I also tried "(Default)" which doesn't return anything. I know if I use RegRead([Path], "") get the default value.  But it doesn't seem to work as intended with this function.

 

To access the (Default) value use "" (an empty string) for the valuename.
 

Update:  I think I figured out what to edit.  Here is my modified function:

Func _RegEnumValEx($aKeyList, $iFlag = 0, $sFilter = "*", $iValueTypes = 0)
    If StringRegExp($sFilter, "\v") Then Return SetError(3, 0, "")
    If Not IsArray($aKeyList) Then $aKeyList = StringSplit($aKeyList, @LF)
    Local $aKeyValList[1954][4], $iKeyVal = Int(BitAND($iFlag, 32) = 0), $sKeyVal = 1953, $sRegEnumVal, $iRegEnumVal, $RegRead = BitAND($iFlag, 256), $vFilter = StringReplace($sFilter, "*", "")
    If Not BitAND($iFlag, 64) Then $sFilter = StringRegExpReplace(BitAND($iFlag, 16) & "(?i)(", "16\(\?\i\)|\d+", "") & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($sFilter, "[^*?|]+", "\\Q$0\\E"), "\\E(?=\||$)", "$0\$"), "(?<=^|\|)\\Q", "^$0"), "\*+", ".*") & ")"
    For $i = 1 To $aKeyList[0]
        $iRegEnumVal = 0
        While 1
            If $sFilter = "(?i)()" And $iRegEnumVal > 0 Then ExitLoop
            If $iKeyVal = $sKeyVal Then
                If $sKeyVal = 3999744 Then ExitLoop
                $sKeyVal *= 2
                ReDim $aKeyValList[$sKeyVal + 1][4]
            EndIf
            $aKeyValList[$iKeyVal][0] = $aKeyList[$i]
            $iRegEnumVal += 1
            $sRegEnumVal = RegEnumVal($aKeyList[$i], $iRegEnumVal)
            If @Error <> 0 Then
                If $iRegEnumVal = 1 And $vFilter = "" Then $iKeyVal += 1
                ExitLoop
            EndIf
            If $sFilter = "(?i)()" And $sRegEnumVal <> "" Then ExitLoop
            If BitAND(@Extended, $iValueTypes) <> $iValueTypes Then ContinueLoop
            If $vFilter And Not StringRegExp($sRegEnumVal, $sFilter) Then ContinueLoop
            $aKeyValList[$iKeyVal][1] = $sRegEnumVal
            If $RegRead Then $aKeyValList[$iKeyVal][2] = RegRead($aKeyList[$i], $sRegEnumVal)
            $iKeyVal += 1
        WEnd
    Next
    $sRegEnumVal = $iKeyVal - Int(BitAND($iFlag, 32) = 0)
    If Not $sRegEnumVal Or ($sRegEnumVal = 1 And $vFilter = "" And $aKeyValList[$iKeyVal - $sRegEnumVal][2] = "") Then Return SetError(4, 0, "")
    ReDim $aKeyValList[$iKeyVal][4]
    If Not BitAND($iFlag, 32) Then $aKeyValList[0][0] = $iKeyVal - 1
    Return $aKeyValList
EndFunc

Just use "" as the $sFilter and it should now only return the (Default) Values. ;)

Edited by Proph

Share this post


Link to post
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
Sign in to follow this  
Followers 0

  • Similar Content

    • Dimmae
      By Dimmae
      Hello,
      at first: i'm new here, so please forgive me my mistakes, and show them to me, just that i can learn to do better in the future.
      Now to my Problem: i have an excel sheet, where i just need some columns for further actions, but i have no idea how to add single columns to a new array.
      I found the following code(the one i just added as a file) from 'water' in this forum, but i wont get how i could add multiple columns into a new array.
      The biggest problem in my situation is that i dont know the count of the rows i need for the array, i just got a fix number of rows, which is 4.
       
      Hope you can help me, and sry again for this 'unlucky illustration'.
       
      btw: how can i add code shown as code here, instead of posting it as a attached file?.
       
       
       
      autoit-select-column.au3
      defects.xlsx
    • imitto
      By imitto
      Hello all!
      I use Autoit for a while, already made some automation for a TV station's master control room with it. I made a UDF to easily work with PAL timecode and time with milliseconds, convert, add or subtract them. Feel free to use it if you want something like this
      #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Description=PAL Timecode Calculator UDF #AutoIt3Wrapper_Res_LegalCopyright=horvath.imre@gmail.com #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ; ; #FUNCTION# ; Name...........: _tcAdd ; Description....: Returns addition of two timecodes ; Syntax.........: _tcAdd($fTc1, fTc2 [, $fFormat = "P"]) ; ; Parameters.....: $fTc1 - First timecode in hh:mm:ss.ff format ; $fTc2 - Second timecode in hh:mm:ss.ff format ; $fFormat - Time base - "P" (default): PAL (25 fps) ; "M" : millisecond ; ; Return value...: Sum of the two timecode in the selected format Func _tcAdd($fTc1, $fTc2, $fFormat = "P", $fHourFormat = 1) Local $fMs1 = _tcToMs($fTc1) Local $fMs2 = _tcToMs($fTc2) Local $fSumMs = $fMs1 + $fMs2 Return _msToTc($fSumMs, $fFormat, $fHourFormat) EndFunc ; #FUNCTION# ; Name...........: _tcsSub ; Description....: Returns addition of two timecodes ; Syntax.........: _tcSub($fTc1, fTc2 [, $fFormat = "P"]) ; ; Parameters.....: $fTc1 - First timecode in hh:mm:ss.ff format ; $fTc2 - Second timecode in hh:mm:ss.ff format ; $fFormat - Time base - "P" (default): PAL (25 fps) ; "M" : millisecond ; ; Return value...: Subtract $fTc2 from $fTc1 in the source format Func _tcSub($fTc1, $fTc2, $fFormat = "P") Local $fMs1 = _tcToMs($fTc1) Local $fMs2 = _tcToMs($fTc2) Local $fSumMs = $fMs1 - $fMs2 If $fSumMs < 0 Then $fSumMs = _tcToMs("24:00:00.00") - ($fSumMs * -1) EndIf Return _msToTc($fSumMs, $fFormat) EndFunc ; #FUNCTION# ; Name...........: _tcToMs ; Description....: Returns timecode converted to total milliseconds ; Syntax.........: _tcToMs($fTc) ; ; Parameters.....: $fTc - Timecode in hh:mm:ss.ff or hh:mm:ss:xxx format, where xxx are milliseconds ; ; Return value...: Milliseconds as an integer value Func _tcToMs($fTc) Local $fTemp = StringSplit($fTc, ":.") Local $fChr = StringLen($fTemp[4]) Switch $fChr Case 2 Return ($fTemp[4] * 40) + ($fTemp[3] * 1000) + ($fTemp[2] * 60000) + ($fTemp[1] * 3600000) Case 3 Return ($fTemp[4]) + ($fTemp[3] * 1000) + ($fTemp[2] * 60000) + ($fTemp[1] * 3600000) EndSwitch EndFunc ; #FUNCTION# ; Name...........: _msToTc ; Description....: Converts total milliseconds to timecode ; Syntax.........: _msToTc($fIn, $fFormat = "P", $fHourFormat = 1) ; ; Parameters.....: $fIn - Time in milliseconds ; $fFormat - Output format "P": PAL TC (default) ; "M": hh:mm:ss.xxx where xxx are milliseconds ; $fHourFormat - Hour format "1": max. value is 23, then starts from 0 (default) ; "0": hours can be more then 23 ; ; Return value...: Timecode as string in the selected format Func _msToTc($fIn, $fFormat = "P", $fHourFormat = 1) Switch $fFormat Case "P" Local $fFr = StringFormat("%02i", (StringRight($fIn, 3) - Mod(StringRight($fIn, 3), 40)) / 40) Case "M" Local $fFr = StringFormat("%03i", StringRight($fIn, 3)) EndSwitch $fIn = StringTrimRight($fIn, 3) Local $fSec = StringFormat("%02i", Mod($fIn, 60)) $fIn -= $fSec Local $fMinTot = $fIn / 60 Local $fMin = StringFormat("%02i", Mod($fMinTot, 60)) $fIn -= $fMin*60 Local $fHourTot = $fIn / 60 / 60 Switch $fHourFormat Case 1 $fHour = StringFormat("%02i", Mod($fHourTot, 24)) Case 0 $fHour = StringFormat("%02i", $fHourTot) EndSwitch Return($fHour & ":" & $fMin & ":" & $fSec & "." & $fFr) EndFunc ; #FUNCTION# ; Name...........: _tcFormatChange ; Description....: Toggle TC format ; Syntax.........: _tcFormatChange($fTc) ; ; Parameters.....: $fTc - Timecode in hh:mm:ss.ff or hh:mm:ss:xxx format, where xxx are milliseconds ; ; Return value...: PAL timecode or time with milliseconds as string, depends on input Func _tcFormatChange($fTc) Local $fTemp = StringSplit($fTc, ":.") Local $fChr = StringLen($fTemp[4]) Switch $fChr Case 2 Return $fTemp[1]&":"&$fTemp[2]&":"&$fTemp[3]&"."&StringFormat("%03i", $fTemp[4]*40) Case 3 Return $fTemp[1]&":"&$fTemp[2]&":"&$fTemp[3]&"."&StringFormat("%02i", ($fTemp[4]-Mod($fTemp[4], 40))/40) EndSwitch EndFunc And the example script:
      #include<_PAL_TC_Calc.au3> $palTC1 = "00:01:12.20" $palTC2 = "23:59:50.02" $msTC1 = "00:01:12.800" $msTC2 = "23:59:50.120" MsgBox(0, "1", _tcAdd($palTC1, $palTC2)); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns PAL TC format MsgBox(0, "2", _tcAdd($palTC1, $palTC2, "M")); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns time with milliseconds format MsgBox(0, "3", _tcAdd($palTC1, $palTC2, "M", 0)); Adds $palTC1 to $palTC2, hours can be infinite, returns time with milliseconds format MsgBox(0, "4", _tcAdd($msTC1, $msTC2)); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns PAL TC format MsgBox(0, "5", _tcAdd($msTC1, $msTC2, "M")); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns time with milliseconds format MsgBox(0, "6", _tcAdd($msTC1, $msTC2, "M", 0)); Adds $palTC1 to $palTC2, hours can be infinite, returns time with milliseconds format MsgBox(0, "7", _tcSub($palTC2, $palTC1)); Subtract $palTC1 from $palTC2, returns PAL TC format MsgBox(0, "8", _tcSub($palTC2, $palTC1, "M")); Subtract $palTC1 from $palTC2, time with milliseconds format MsgBox(0, "9", _tcSub($msTC1, $msTC2)); Subtract $palTC1 from $palTC2, returns PAL TC format - when hits zero, counts back from 24:00:00.00 MsgBox(0, "10", _tcSub($msTC1, $msTC2, "M")); Subtract $palTC1 from $palTC2, time with milliseconds format - when hits zero, counts back from 24:00:00.000 MsgBox(0, "11", _tcFormatChange($palTC2)); Convert PAL TC to time with milliseconds and back MsgBox(0, "12", _tcFormatChange($msTC2)); Convert PAL TC to time with milliseconds and back  
      TC_CALC_example.au3
      _PAL_TC_Calc.au3
    • TRAGENALPHA
      By TRAGENALPHA
      A small UDF to Modify the Console Interface.
      #include-once ;#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 ; =============================================================================================================================== ; Name...........: Console Modify ; Description ...: A small UDF to manipulate the Console Interface for scripts that are compiled as a console application. ; Syntax.........: _ConsoleClear() -- Clears the Console ; _ConsoleTitle("VALUE") - Sets the console title. ; _ConsoleWindow([WIDTH BUFFER SIZE], [HEIGHT BUFFER SIZE]) - Sets the Width and Height Buffer size of the console. ; Parameters ....: $bh6e5v_ctval = Title of the Console Window. ; $bh6e5v_cwwidth = Window width buffer size. ; $bh6e5v_cwheight = Window height buffer size. ; Return values .: True = Console window buffer size has been changed ; False = Failed to change console window buffer size. ; Author ........: TRAGENALPHA <3 ; Example .......: _ConsoleTitle("This is the new title") // _ConsoleWindow(200, 60) ; =============================================================================================================================== ; -- This is here because writing RunDos and including a whole UDF is too much. But this is basically just _RunDos() ;Func cmd($bh6e5v_ldvar) ; RunWait(@ComSpec & " /c " & $bh6e5v_ldval) ;EndFunc Func _ConsoleClear() RunWait(@ComSpec & " /c cls") EndFunc Func _ConsoleTitle($bh6e5v_ctval) RunWait(@ComSpec & " /c title " & $bh6e5v_ctval) EndFunc Func _ConsoleWindow($bh6e5v_cwwidth, $bh6e5v_cwheight) If IsNumber($bh6e5v_cwwidth) And IsNumber($bh6e5v_cwheight) And ($bh6e5v_cwwidth > 0) And ($bh6e5v_cwheight > 0) Then RunWait(@ComSpec & " /c mode con: cols=" & $bh6e5v_cwwidth & " lines=" & $bh6e5v_cwheight) Return True Else Return False EndIf EndFunc  
      ConsoleModify.au3
    • Gowrisankar
      By Gowrisankar
      Hello everyone,
      I'm working on a task where, a PDF file is opened (in IE browser) when I click a link in a website.
      I have to read the first page of the PDF to find particular strings. Can you please share some ideas?
    • DeathChicken
      By DeathChicken
      If possible please add or edit the comments to explain how this works.
       
      ;includes functions from other things
      #include <GDIPlus.au3>
      #include <ScreenCapture.au3>
      ;hotkeys
      HotKeySet("{ESC}", _exit)
      HotKeySet("{F1}", _scan)
      ;global variables
      Global $win_title                    ;name of the window
      Global $area_x                        ;
      Global $area_y                        ;
      Global $area_w                       ;
      Global $area_h                        ;
      Global $cursor                         ;
      Global $rect_file                      ;
      Global $hbmpscreen              ;
      Global $i=  1043                      ;moves the rect
      Global $ii=    378                      ;moves the rect
      Global $x=1044                        ;inner rect offset
      Global $y=501                          ;inner rect offset
      Global $hbmprect                    ;image inside rect
      Global $hscreen                        ;image whole screen
                                         
      _GDIPlus_Startup()                    ;?
      ;display hotkeys on screen
      ToolTip("Press F1 to scan | Press ESC to Exit",0,0)
                                          ;infinite loop to keep prog running
      While 1
          Sleep(100)
      WEnd
      Func _scan()
      ;~ reads your screen area:
      _read()
      ;~ converts screen captured into bmp
      _convert()
      ;~ .  Loads converted bmp to be read
      _loadBMP()
      ;~ compares the bmp of your scanned screen to the actual screen that is being displayed
      _compare()
      EndFunc
                                          ;reads screen
      Func _read()
          $hscreen = _ScreenCapture_CaptureWnd("", WinGetHandle($win_title), $area_x, $area_y, $area_x + $area_w, $area_y + $area_h, $cursor)
      EndFunc
                                          ;converts screen into bmp
      Func _convert()
          _GDIPlus_BitmapCreateFromHBITMAP($hscreen)
      EndFunc
                                          ;loads converted screen
      Func _loadBMP()
      _GDIPlus_BitmapCreateFromFile($rect_file)
      EndFunc
                                          ;compares savedBMP to current screen
      Func _compare()
      ;If(                              below code                                     ) = (                   below code           ) Then
      If _GDIPlus_BitmapGetPixel($hbmpscreen, ($i + $x) - $area_x, ($ii + $y) - $area_y) = _GDIPlus_BitmapGetPixel($hbmprect, $x, $y) Then
      ;display message box titled found with a message of found
      MsgBox("","","found")
      ;if above is not correct then
      EndIf
      EndFunc
                                          ;exit func
      Func _exit()
          Exit
      EndFunc