Что нового

Сохранение в ini из [GUICtrlCreateListView]

Zero

Новичок
Сообщения
11
Репутация
0
Наткнулся на скрипт от CreatoR пытаюсь сделать сохрание пароля, выбранных файлов и папок в ini файл, чтоб при следующем запуске они отображались в [GUICtrlCreateListView], но пока без результатно. (Скрипт с Resources во вложениях)
Код:
;BlockIt Utility by (Mr)CreatoR (main idea by rasim) - First Alpha version.
;Tested on WinXP SP2 Russian localization
;Download URL: http://creator-lab.ucoz.ru/AutoIt/BlockIt_Utility.zip

#NoTrayIcon
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Misc.au3>
#include <Resources\CustomBox.au3>
;

HotKeySet("^+b", "_Show_BlockIt_Window_Proc")

Opt("WinWaitDelay", 1)
Opt("WinTextMatchMode", 2)

Global Const $WM_DROPFILES = 0x0233 

Global $aBlockedFiles_List[1][1]
Global $aDroppedFiles[1]
Global $iItem_Checked = False
Global $iShow_BlockMsg = False

Global $iTimer_Time = 100
Global $ahTimer = _TimerStart("_Check_BlockMsg_Proc", $iTimer_Time)

Global $hGUI = GUICreate("BlockIt Utility - by (Mr)CreatoR (main idea by rasim)", 600, 380, -1, -1, -1, $WS_EX_ACCEPTFILES)

Global $nSpaceCtrl_Dummy = GUICtrlCreateDummy()
Global $aAccelKeys[8][2] = [ _
	["{Space}", $nSpaceCtrl_Dummy], _
	["^{Space}", $nSpaceCtrl_Dummy], _
	["!{Space}", $nSpaceCtrl_Dummy], _
	["+{Space}", $nSpaceCtrl_Dummy], _
	["^+{Space}", $nSpaceCtrl_Dummy], _
	["^+!{Space}", $nSpaceCtrl_Dummy], _
	["+!{Space}", $nSpaceCtrl_Dummy], _
	["^!{Space}", $nSpaceCtrl_Dummy]]

GUICtrlCreateLabel("* To block Files/Folders, Drag && Drop them to the list bellow", 20, 10, 500, 17)
GUICtrlSetFont(-1, 9, 800)
GUICtrlSetColor(-1, 0xFF0000)

$Blocked_ListView = GUICtrlCreateListView("Blocked Items", 20, 30, 560, 300, _
	BitOr($GUI_SS_DEFAULT_LISTVIEW, $LVS_NOCOLUMNHEADER), BitOR($LVS_EX_CHECKBOXES, $WS_EX_CLIENTEDGE, $WS_EX_DLGMODALFRAME))

GUICtrlSendMsg($Blocked_ListView, $LVM_SETCOLUMNWIDTH, 0, 550)
GUICtrlSetState($Blocked_ListView, $GUI_DROPACCEPTED)

$AddFiles_Button = GUICtrlCreateButton("Add Files...", 20, 340, 70, 20)
$AddFolder_Button = GUICtrlCreateButton("Add Folder...", 100, 340, 70, 20)

GUISetState(@SW_SHOW, $hGUI)

GUISetAccelerators($aAccelKeys, $hGUI)
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
    Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			_Quit_Proc()
		Case $GUI_EVENT_MINIMIZE
			GUISetState(@SW_HIDE, $hGUI)
		Case $GUI_EVENT_DROPPED
			Local $aIconInfo, $LV_Item
			
			For $i = 1 To $aDroppedFiles[0]
				$LV_Item = GUICtrlCreateListViewItem($aDroppedFiles[$i], $Blocked_ListView)
				
				$aIconInfo = _FileGetIcon($aDroppedFiles[$i])
				
				If @error Or Not FileExists($aIconInfo[1]) Then
					$aIconInfo[1] = "Shell32.dll"
					$aIconInfo[2] = 3
				EndIf
				
				If $aIconInfo[2] > 0 Then
					$aIconInfo[2] = -($aIconInfo[2]+1)
				ElseIf $aIconInfo[2] < 0 Then
					$aIconInfo[2] = -$aIconInfo[2]
				EndIf
				
				GUICtrlSetImage($LV_Item, $aIconInfo[1], $aIconInfo[2])
			Next
			
			GUICtrlSendMsg($Blocked_ListView, $LVM_SETCOLUMNWIDTH, 0, -1)
		Case $AddFiles_Button
			Local $sFile = FileOpenDialog("Please select File to Block", "", "All files (*.*)", 15, "", $hGUI)
			If @error Then ContinueLoop
			
			Local $LV_Item
			Local $aFiles = StringSplit($sFile, "|")
			If $aFiles[0] = 1 Then Dim $aFiles[3] = [2, @WorkingDir, StringRegExpReplace($sFile, "^.*\\", "")]
			
			For $i = 2 To $aFiles[0]
				$LV_Item = GUICtrlCreateListViewItem($aFiles[1] & "\" & $aFiles[$i], $Blocked_ListView)
				
				$aIconInfo = _FileGetIcon($aFiles[1] & "\" & $aFiles[$i])
				
				If @error Or Not FileExists($aIconInfo[1]) Then
					$aIconInfo[1] = "Shell32.dll"
					$aIconInfo[2] = 3
				EndIf
				
				If $aIconInfo[2] > 0 Then
					$aIconInfo[2] = -($aIconInfo[2]+1)
				ElseIf $aIconInfo[2] < 0 Then
					$aIconInfo[2] = -$aIconInfo[2]
				EndIf
				
				GUICtrlSetImage($LV_Item, $aIconInfo[1], $aIconInfo[2])
			Next
		Case $AddFolder_Button
			Local $sFolder = FileSelectFolder("Please select Folder to Block", "", 6, @WorkingDir, $hGUI)
			If @error Then ContinueLoop
			
			Local $LV_Item = GUICtrlCreateListViewItem($sFolder, $Blocked_ListView)
			Local $aIconInfo = _FileGetIcon($sFolder)
			
			If @error Or Not FileExists($aIconInfo[1]) Then
				$aIconInfo[1] = "Shell32.dll"
				$aIconInfo[2] = 3
			EndIf
			
			If $aIconInfo[2] > 0 Then
				$aIconInfo[2] = -($aIconInfo[2]+1)
			ElseIf $aIconInfo[2] < 0 Then
				$aIconInfo[2] = -$aIconInfo[2]
			EndIf
			
			GUICtrlSetImage($LV_Item, $aIconInfo[1], $aIconInfo[2])
		Case $nSpaceCtrl_Dummy
			$iItem_Checked = String(_GUICtrlListView_GetSelectedIndices($Blocked_ListView))
			$iIndex = Number($iItem_Checked)
			$iItem_State = _GUICtrlListView_GetItemChecked($Blocked_ListView, $iIndex)
			_GUICtrlListView_SetItemChecked($Blocked_ListView, $iIndex, Not $iItem_State)
	EndSwitch
	
	If IsString($iItem_Checked) Then
		$iIndex = Number($iItem_Checked)
		$iItem_Checked = False
		
		$sItem_Data = _GUICtrlListView_GetItemText($Blocked_ListView, $iIndex)
		$iItem_State = _GUICtrlListView_GetItemChecked($Blocked_ListView, $iIndex)
		
		If $iItem_State = 1 Then
			_BlockFile_Proc($sItem_Data)
			
			Switch @error
				Case 1, 2
					_GUICtrlListView_SetItemChecked($Blocked_ListView, $iIndex, False)
					
					If @error = 2 Then
						$sErrorMsg = "Error - Unable to Block the File [Block Failed]:"
						If _IsFolder($sItem_Data) Then $sErrorMsg = "Error - Unable to Block the Folder [Block Failed]:"
						_CustomBox($sErrorMsg, $sItem_Data, 0, 0, $hGUI, 0x00000014)
					EndIf
			EndSwitch
		Else
			_UnBlockFile_Proc($sItem_Data)
			If @error Then _GUICtrlListView_SetItemChecked($Blocked_ListView, $iIndex, True)
		EndIf
	EndIf
	
	If IsString($iShow_BlockMsg) Then
		$sFile_Path = $iShow_BlockMsg
		$iShow_BlockMsg = False
		
		$sErrorMsg = "Error - Unable to Open the File:"
		If _IsFolder($sFile_Path) Then $sErrorMsg = "Error - Unable to Open the Folder:"
		
		_CustomBox($sErrorMsg, _
			StringFormat("This object (%s) is blocked by BlockIt Utility.", _
				StringRegExpReplace($sFile_Path, "^.*\\", "")), 0, 1, $hGUI)
		
		$ahTimer = _TimerStart("_Check_BlockMsg_Proc", $iTimer_Time)
	EndIf
WEnd

Func _BlockFile_Proc($sFile, $iShowErrMsg=1)
	Local $sPass = InputBox("File security", "Please set a password to Block current file: " & _
		StringRegExpReplace($sFile, "^.*\\", ""), "", "*", 300, 200, -1, -1, 0, $hGUI)
	If @error Or $sPass = "" Then Return SetError(1, 0, 0)
	
	Local $hFile = _CreateFile($sFile)
	
	If $hFile = -1 Then
		If $iShowErrMsg Then
			Local $sErrorMsg = "Error - Unable to Block the File:"
			If _IsFolder($sFile) Then $sErrorMsg = "Error - Unable to Block the Folder:"
			
			_CustomBox($sErrorMsg, $sFile, 0, 0, $hGUI, 0x00000014)
		EndIf
		
		Return SetError(2, 0, 0)
	EndIf
	
	For $i = 1 To $aBlockedFiles_List[0][0]
		If $aBlockedFiles_List[$i][1] = $sFile Then
			$aBlockedFiles_List[$i][0] = $hFile
			$aBlockedFiles_List[$i][2] = $sPass
			
			Return
		EndIf
	Next
	
	$aBlockedFiles_List[0][0] += 1
	ReDim $aBlockedFiles_List[$aBlockedFiles_List[0][0]+1][3]
	
	$aBlockedFiles_List[$aBlockedFiles_List[0][0]][0] = $hFile
	$aBlockedFiles_List[$aBlockedFiles_List[0][0]][1] = $sFile
	$aBlockedFiles_List[$aBlockedFiles_List[0][0]][2] = $sPass
EndFunc

Func _UnBlockFile_Proc($sFile, $iShowErrMsg=1)
	Local $sCurPass = InputBox("File security", "Please enter a password to UnBlock current file: " & _
		StringRegExpReplace($sFile, "^.*\\", ""), "", "*", 300, 200, -1, -1, 0, $hGUI)
	If @error Then Return SetError(2, 0, 0)
	
	Local $sFile_ErrMsg = "", $aRet, $aTmpArr[1][1]
	
	For $i = 1 To $aBlockedFiles_List[0][0]
		If $aBlockedFiles_List[$i][1] = $sFile Then
			If $aBlockedFiles_List[$i][2] == $sCurPass Then
				$aRet = DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $aBlockedFiles_List[$i][0])
				If @error Or Not $aRet[0] Then
					$sFile_ErrMsg = "[CloseHandle Fail]: "
				Else
					ContinueLoop
				EndIf
			Else
				$sFile_ErrMsg = "[Wrong Password]: "
			EndIf
		EndIf
		
		$aTmpArr[0][0] += 1
		ReDim $aTmpArr[$aTmpArr[0][0]+1][3]
		
		$aTmpArr[$aTmpArr[0][0]][0] = $aBlockedFiles_List[$i][0]
		$aTmpArr[$aTmpArr[0][0]][1] = $aBlockedFiles_List[$i][1]
		$aTmpArr[$aTmpArr[0][0]][2] = $aBlockedFiles_List[$i][2]
	Next
	
	$aBlockedFiles_List = $aTmpArr
	
	If $iShowErrMsg And $sFile_ErrMsg <> "" Then
		Local $sErrorMsg = "Error - Unable to UnBlock the File "
		If _IsFolder($sFile) Then $sErrorMsg = "Error - Unable to UnBlock the Folder "
		
		_CustomBox($sErrorMsg & $sFile_ErrMsg, $sFile, 0, 0, $hGUI, 0x00000014)
		Return SetError(1, 0, $sFile_ErrMsg)
	Else
		;MsgBox(64, "Success", "File UnBlocked.", 0, $hGUI)
	EndIf
EndFunc

Func _Check_BlockMsg_Proc($hWnd, $Msg, $iIDTimer, $dwTime)
	If IsArray($ahTimer) Then _TimerStop($ahTimer[0], $ahTimer[1])
	
	If WinExists("[CLASS:#32770;REGEXPTITLE:.+]", "\") Then
		Local $sWinText = WinGetText("[CLASS:#32770;REGEXPTITLE:.+]", "\")
		
		If $sWinText <> "" Then
			For $i = 1 To $aBlockedFiles_List[0][0]
				If StringInStr($sWinText, $aBlockedFiles_List[$i][1]) Then
					WinClose("[CLASS:#32770;REGEXPTITLE:.+]", $aBlockedFiles_List[$i][1])
					
					$iShow_BlockMsg = $aBlockedFiles_List[$i][1]
					
					Return
				EndIf
			Next
		EndIf
	EndIf
	
	$ahTimer = _TimerStart("_Check_BlockMsg_Proc", $iTimer_Time)
EndFunc

Func _Show_BlockIt_Window_Proc()
	If Not BitAND(WinGetState($hGUI), 2) Then
		GUISetState(@SW_SHOW, $hGUI)
		GUISetState(@SW_RESTORE, $hGUI)
	EndIf
EndFunc

Func _CreateFile($sFile)
    Local Const $GENERIC_READ  = 0x80000000
    Local Const $GENERIC_WRITE = 0x40000000
	Local Const $FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
    Local Const $OPEN_EXISTING = 3
	
	Local $iFolderOpen = 0
	If _IsFolder($sFile) Then $iFolderOpen = $FILE_FLAG_BACKUP_SEMANTICS
	
    $sFile = "\\.\" & $sFile
	
    Local $aRet = DllCall("kernel32.dll", "hwnd", "CreateFile", _
                                          "str", $sFile, _
                                          "int", BitOR($GENERIC_READ, $GENERIC_WRITE), _
                                          "int", 0, _
                                          "ptr", 0, _
                                          "int", $OPEN_EXISTING, _
                                          "int", $iFolderOpen, _
                                          "int", 0)
    Return $aRet[0]
EndFunc

Func _FileGetIcon($sFile)
	Local $iOld_Opt_EES = Opt("ExpandEnvStrings", 1)
	Local $sRegDefault = "", $sDefIcon = "", $sExt, $hSearch, $sIconFile, $nIcon=0
	Local $aRet[3], $iError = 0
	
	If _IsFolder($sFile) Then
		$sRegDefault = RegRead("HKCR\Folder", "")
		If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
	Else
		$sExt = StringRegExpReplace($sFile, '^.*\.', '.')
		
		If $sExt = ".lnk" Then
			Local $aLinkInfo = FileGetShortcut($sFile)
			
			If Not @error Then
				Opt("ExpandEnvStrings", $iOld_Opt_EES)
				
				If Not FileExists($aLinkInfo[4]) Then
					Local $a_LinkInfo = _FileGetIcon($aLinkInfo[0])
					
					If Not @error Then
						$aLinkInfo[4] = $a_LinkInfo[1]
						$aLinkInfo[5] = $a_LinkInfo[2]
					EndIf
				EndIf
				
				Dim $aRet[3] = [2, $aLinkInfo[4], $aLinkInfo[5]]
				Return $aRet
			EndIf
		EndIf
		
		If $sExt = $sFile Then
			$hSearch = FileFindFirstFile($sFile & ".*")
			$sExt = StringRegExpReplace(FileFindNextFile($hSearch), '^.*\.', '.')
			$sFile &= $sExt
			FileClose($hSearch)
		EndIf
		
		$sRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $sExt, "ProgID")
		
		If $sRegDefault = "" Then $sRegDefault = RegRead("HKCR\" & $sExt, "")
		If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\" & $sRegDefault & "\DefaultIcon", "")
	EndIf
	
	If $sDefIcon = "" Then
		$sIconFile = "shell32.dll"
	ElseIf $sDefIcon <> "%1" Then
		If StringRegExpReplace($sFile, "^.*\\", "") = "shell32.dll" Then
			$sIconFile = $sFile
			$nIcon = 0
		Else
			Local $aDefIconSplit = StringSplit($sDefIcon, ",")
			
			If IsArray($aDefIconSplit) Then
				$sIconFile = $aDefIconSplit[1]
				If $aDefIconSplit[0] > 1 Then $nIcon = $aDefIconSplit[2]
			Else
				$iError = 1
			EndIf
		EndIf
	ElseIf $sDefIcon = "%1" Then
		$sIconFile = $sFile
		$nIcon = 0
	EndIf
	
	Opt("ExpandEnvStrings", $iOld_Opt_EES)
	
	Dim $aRet[3] = [2, $sIconFile, $nIcon]
	
	Return SetError($iError, 0, $aRet)
EndFunc

Func _IsFolder($sPath)
	Return StringInStr(FileGetAttrib($sPath & "\"), "D")
EndFunc

Func _TimerStart($sFunction, $iTime=250)
	Local $hCallBack = DllCallbackRegister($sFunction, "none", "hwnd;int;int;dword")
	
	Local $aDll = DllCall("user32.dll", "int", "SetTimer", _
		"hwnd", 0, _
		"int", TimerInit(), _
		"int", $iTime, _
		"ptr", DllCallbackGetPtr($hCallBack))
	
	Local $aRet[2] = [$hCallBack, $aDll[0]]
	
	Return $aRet
EndFunc

Func _TimerStop(ByRef $hCallBack, ByRef $hTimer)
	If $hCallBack > 0 Then DllCallBackFree($hCallBack)
	Local $aRet = DllCall("User32.dll", "int", "KillTimer", "hwnd", 0, "int", $hTimer)
	
	$hCallBack = 0
	$hTimer = 0
	
	Return $aRet[0]
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
	$hWndListView = $Blocked_ListView
	If Not IsHWnd($Blocked_ListView) Then $hWndListView = GUICtrlGetHandle($Blocked_ListView)

	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	
	Switch $hWndFrom
		Case $hWndListView
			Switch $iCode
				Case $NM_CLICK, $NM_DBLCLK, $NM_RCLICK, $LVN_ITEMCHANGED
					Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					Local $iIndex = DllStructGetData($tInfo, "Index")
					
					If $iIndex <> -1 Then
						Local $iX = DllStructGetData($tInfo, "X")
						Local $iPart = 1
						If _GUICtrlListView_GetView($Blocked_ListView) = 1 Then $iPart = 2 ;for large icons view
						
						Local $aIconRect = _GUICtrlListView_GetItemRect($Blocked_ListView, $iIndex, $iPart)
						
						If $iX < $aIconRect[0] And $iX >= 5 Then
							$iItem_Checked = String($iIndex)
							
							Return 0
						EndIf
					EndIf
			EndSwitch
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc

Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
	Local $nSize, $pFileName
	Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
	
	$aDroppedFiles = 0
	Dim $aDroppedFiles[1]
	
	For $i = 0 To $nAmt[0] - 1
		$nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
		$nSize = $nSize[0] + 1
		$pFileName = DllStructCreate("char[" & $nSize & "]")
        
		DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", _
			DllStructGetPtr($pFileName), "int", $nSize)
		
		$aDroppedFiles[0] += 1
		ReDim $aDroppedFiles[$aDroppedFiles[0]+1]
		
		$aDroppedFiles[$aDroppedFiles[0]] = DllStructGetData($pFileName, 1)
		$pFileName = 0
	Next
EndFunc

Func _Quit_Proc()
	For $i = 1 To $aBlockedFiles_List[0][0]
		DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $aBlockedFiles_List[$i][0])
	Next
	
	If IsArray($ahTimer) Then _TimerStop($ahTimer[0], $ahTimer[1])
	
	Exit
EndFunc
 
Верх