#include <GUIConstants.au3>
#Include <GuiListView.au3>
#include <array.au3>
Dim $i = 0, $j = 0, $msg = "", $RegKey = "HKEY_CLASSES_ROOT\", $Descrip = "", $Ext, $arAllExt[1], $arWert1[1], $arExt[1], $arDiscrip[1]
Dim $Wert1, $Wert2, $Val, $Fehler1 = 0, $Fehler2 = 0, $Abbruch = 0
$arAllExt[0] = 0
$arWert1[0] = 0
$arExt[0] = 0
$arDiscrip[0] = 0

$HKCR = GUICreate("Versteckte Dateitypen", 617, 384, 235, 250)
$ListView1 = GUICtrlCreateListView("Registry-Schlüssel|Erweiterung|Beschreibung", 8, 40, 601, 336, BitOR($LVS_NOSORTHEADER, $LVS_SINGLESEL))
_GUICtrlListViewSetColumnWidth(-1, 0, 258)
_GUICtrlListViewSetColumnWidth(-1, 1, 70)
_GUICtrlListViewSetColumnWidth(-1, 2, 268)
$bEnde = GUICtrlCreateButton("Schließen", 509, 10, 100, 20, 0)
$bShowExt = GUICtrlCreateButton("Erweiterung sichtbar machen", 198, 10, 170, 20, 0)
$bShowHiddenExt = GUICtrlCreateButton("Zeige Versteckte Dateitypen", 8, 10, 170, 20, 0)

$Busy = GUICreate("", 160, 110, -1, -1, $WS_POPUP)
GUISetBkColor(0x708090)
$label_busy = GUICtrlCreateLabel("Einen Moment bitte." & @LF & @LF & "Die notwendigen Daten" _
		 & @LF & "werden ermittelt..", 20, 15, 120, 100, $SS_CENTER)
GUICtrlSetFont(-1, 10, Default, 2)
GUICtrlSetColor(-1, 0xF0E68C)

GUISetState(@SW_SHOW, $HKCR)
While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE Or $msg = $bEnde
			ExitLoop
		Case $msg = $bShowHiddenExt
			GUISetState(@SW_SHOW, $Busy)
			_ReadReg()
			_ExtRead()
			GUISetState(@SW_HIDE, $Busy)
			_FillList()
		Case $msg = $bShowExt
			_ShowExtension()
			If $Abbruch = 0 Then _GUICtrlListViewDeleteItemsSelected($ListView1)
	EndSelect
WEnd
Exit

Func _ReadReg()
	Do
		$i += 1
		$Wert1 = RegEnumKey($RegKey, $i)
		$Fehler1 = @error
		If $Fehler1 = 0 Then
			If StringLeft($Wert1, 1) = "." Then
				_ArrayAdd($arAllExt, $Wert1)
				$arAllExt[0] += 1
			EndIf
			RegRead($RegKey & $Wert1, "NeverShowExt")
			$Fehler2 = @error
			If $Fehler2 = 0 Then
				_ArrayAdd($arWert1, $Wert1)
				$arWert1[0] += 1
				$Descrip = RegRead($RegKey & $Wert1, "")
				_ArrayAdd($arDiscrip, $Descrip)
				$arDiscrip[0] += 1
			EndIf
		EndIf
	Until $Fehler1 <> 0
EndFunc   ;==>_ReadReg

Func _ExtRead()
	For $i = 1 To $arWert1[0]
		For $j = 1 To $arAllExt[0]
			If RegRead($RegKey & $arAllExt[$j], "") = $arWert1[$i] Then
				$Ext = $arAllExt[$j]
				_ArrayAdd($arExt, $Ext)
				$arExt[0] += 1
			EndIf
		Next
	Next
EndFunc   ;==>_ExtRead

Func _FillList()
	For $i = 1 To $arWert1[0]
		GUICtrlCreateListViewItem($RegKey & $arWert1[$i] & "|" & $arExt[$i] & "|" & $arDiscrip[$i], $ListView1)
	Next
EndFunc   ;==>_FillList

Func _ShowExtension()
	If MsgBox(20, "Registry-Wert löschen", "Der gewählte Registry-Wert wird" & @LF & "unwiederruflich gelöscht" _
			 & @LF & @LF & "Wollen Sie fortfahren ?") = 7 _
			Then
		$Abbruch = 1
		Return 0
	Else
		$item = _GUICtrlListViewGetItemText($ListView1, _GUICtrlListViewGetSelectedIndices($ListView1))
		If $item <> "" Then
			If StringInStr($item, ".lnk", 1) Then
				If MsgBox(20, ".lnk anzeigen", "Das Anzeigen von allen Verknüpfungen" & @LF & "führt zu einem Chaos auf dem Desktop!" _
						 & @LF & @LF & "Wollen Sie trotzdem fortfahren ?") = 7 _
						Then
					$Abbruch = 1
					Return 0
				EndIf
			EndIf
			$key = StringLeft($item, StringInStr($item, "|", 0, 1) - 1)
			RegDelete($key, "NeverShowExt")
		EndIf
		$Abbruch = 0
	EndIf
EndFunc   ;==>_ShowExtension