Что нового

Получить список программ, для которых зарегистрированы типы файлов

musicstashall

Знающий
Сообщения
322
Репутация
7
Всем доброго.
Имеется ли стандартный способ получить список программ, для которых зарегистрированы типы файлов? Важно получить такой список как общий, для всех пользователей, так и для текущего пользователя только. Пробовал делать с помощью консольной команды FTYPE:

Код:
Func _GetFtypeData()
	Local $line, $data, $sData
	Local $pid = Run(@COMSPEC & ' /c FTYPE','', @SW_HIDE, $STDOUT_CHILD)
	While 1
		$line &= StdoutRead($pid)
		If @error Then ExitLoop
	Wend
	$data = StringSplit($line, @CR)
	_ArrayDelete($data, $data[0])
	$data[0] -= 1
	_ArrayColInsert($data, 1)
	For $i = 1 To $data[0][0]
		$sData = StringSplit($data[$i][0], '=', 2)
		$data[$i][0] = $sData[0]
		$data[$i][1] = $sData[1]
	Next
	Return $data
EndFunc


Но этот способ возвращает данные только из HKLM, для всех пользователей, а мне надо для текущего только.
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Сделал следующим образом:

Код:
#include <Array.au3>
#include <WinAPIReg.au3>

_ArrayDisplay(GetAssocData(GetAssociateTypeFiles()))

Func GetAssociateTypeFiles($ROOT = 'HKEY_LOCAL_MACHINE\Software\Classes')
	Local $aString = '.ms-windows-store-license.devicemanifest-ms.devicemetadata-ms.searchconnector-ms.settingcontent-ms'
	Local $aExt[2] = [1, '*'], $iCount = 1, $sKey
	While 1
		$sKey = RegEnumKey($ROOT, $iCount)
		If @error Then ExitLoop
		If StringLeft($sKey, 1) = '.' Then
			RegRead($ROOT & '\' & $sKey, '')
			If Abs(@error) <> 1 And StringInStr($aString, $sKey) = 0 Then _ArrayAdd($aExt, $sKey)
		EndIf
		$iCount += 1
	Wend
	_ArrayAdd($aExt, 'Unknown')
	$aExt[0] = UBound($aExt) -1
	Return $aExt
 EndFunc

Func GetAssocData($data)
	Local $assodata[0][2], $read
	For $i = 1 To $data[0]
		$read = _WinAPI_AssocQueryString($data[$i], $ASSOCSTR_EXECUTABLE)
		If $read Then _ArrayAdd($assodata, $data[$i] & '|' & $read)
	Next
	Return $assodata
EndFunc
 
Верх