Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)
FileInstall("Icon.ico",@WindowsDir & "\Icon.ico")
Global $sApp_Name = "SDR - Safe Drive Remover"
;============# Prevent from secondary run #====================================
If _Singleton($sApp_Name, 1) = 0 Then
AU3COM_SendData(WinGetHandle("[CLASS:AutoIt v3 GUI;TITLE:" & $sApp_Name & "]"), 'ShowGUIWindow_Proc()')
Exit
EndIf
;================================================================================
#Region Variables and Settings
Global Const $WM_DEVICECHANGE = 0x0219
Global Const $DBT_DEVICEARRIVAL = 0x8000
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x8004
Global Const $DBT_DEVTYP_VOLUME = 0x00000002
;System Metrics constants
;Global Const $SM_CYCAPTION = 4 ;Caption (Title) heigth
Global Const $SM_CXFIXEDFRAME = 7 ;Window border size
;Global Const $SM_CYMENU = 15 ;Single line menu heigth
;Global Const $SM_CYSMCAPTION = 51 ;Small ("Tools" style?) title bar heigth
Global $aRecv_Ctrls_Data[2][2]
Global $aDrives_TrayItems[100]
Global $hGUI, $hMsg_Wnd, $hListView, $nDriveEject_Button, $nConfirmEjection_CheckBox,$nHide
Global $nTrayIcon, $nShowApp_TrayItem, $nExitApp_TrayItem
Global $iGUI_Def_Left = -1
Global $iGUI_Def_Top = -1
Global $iGUI_Def_Width = 470
Global $iGUI_Def_Height = 240
Global $iGUI_Left = _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Win Left Pos", $iGUI_Def_Left)
Global $iGUI_Top = _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Win Top Pos", $iGUI_Def_Top)
Global $iGUI_Width = _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Win Width", $iGUI_Def_Width)
Global $iGUI_Height = _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Win Height Pos", $iGUI_Def_Height)
Global $iConfirm_Drive_Ejection = _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Confirm Drive Ejection", 1)
Global $sSDR_DLL_PATH = SDR_Dll_Extract_Proc() ;Разворачиваем либу
#EndRegion Variables and Settings
;
CreateTrayItems()
CreateGUI()
Func CreateGUI()
; ************************************ ; GUI creation
$hGUI = GUICreate($sApp_Name, $iGUI_Width, $iGUI_Height, $iGUI_Left, $iGUI_Top, _
BitOr($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX), $WS_EX_CLIENTEDGE)
$hMsg_Wnd = $hGUI
; ************************************ ; Icon
GUISetIcon(@WindowsDir & "\Icon.ico")
; ************************************ ; Events
GUISetOnEvent($GUI_EVENT_CLOSE, "Main_Events")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "Main_Events")
; ************************************ ; ListView
$hListView = GUICtrlCreateListView("Имя|Тип|Полный объем|Свободно|Файловая система", _
10, 10, $iGUI_Width-20, $iGUI_Height-60, -1, BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE))
GUICtrlSetResizing($hListView, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM))
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES))
_GUICtrlListView_SetEquelColWidth($hGUI, $hListView, 1)
;_GUICtrlListView_SetColumnWidth($hListView, 0, 150)
; ************************************ ; Button
$nDriveEject_Button = GUICtrlCreateButton("Остановить", 10, $iGUI_Height-40)
$nHide = GUICtrlCreateButton("Свернуть", 350, $iGUI_Height-40)
GUICtrlSetResizing($nDriveEject_Button, BitOR($GUI_DOCKSIZE, $GUI_DOCKBOTTOM, $GUI_DOCKLEFT))
GUICtrlSetResizing($nHide, BitOR($GUI_DOCKSIZE, $GUI_DOCKBOTTOM, $GUI_DOCKLEFT))
GUICtrlSetOnEvent($nDriveEject_Button, "Main_Events")
GUICtrlSetOnEvent($nHide, "Main_Events")
; ************************************ ; Checkbox
$nConfirmEjection_CheckBox = GUICtrlCreateCheckbox("Подтверждать извлечение", 110, $iGUI_Height-35)
If $iConfirm_Drive_Ejection = 1 Then GUICtrlSetState($nConfirmEjection_CheckBox, $GUI_CHECKED)
GUICtrlSetResizing($nConfirmEjection_CheckBox, BitOR($GUI_DOCKSIZE, $GUI_DOCKBOTTOM, $GUI_DOCKLEFT))
GUICtrlSetOnEvent($nConfirmEjection_CheckBox, "Main_Events")
; ************************************ ; Show the GUI
GUISetState()
ControlClick("SDR - Safe Drive Remover","",9)
; ************************************ ; Image list create
Local $hImage = _GUIImageList_Create(16, 16, 5, 3)
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -8)
_GUICtrlListView_SetImageList($hListView, $hImage, 1)
; ************************************ ; Drives set
DrivesSet_Proc("REMOVABLE")
; ************************************ ; Register Window Messages
GUIRegisterMsg($WM_DEVICECHANGE, "WM_DEVICECHANGE")
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
GUIRegisterMsg($WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED")
GUIRegisterMsg($WM_COPYDATA, "AU3COM_Handler")
; ************************************ ; Main Loop
While 1
Sleep(100)
WEnd
EndFunc
Func CreateTrayItems()
$nTrayIcon = _TrayIconCreate($sApp_Name, @WindowsDir & "\Icon.ico", 0, "Tray_Callback")
_TrayCreateContextMenu()
_TrayIconSetClick(-1, 16)
$nShowApp_TrayItem = _TrayCreateItem("Показать главное окно программы")
_TrayItemSetIcon(-1, @WindowsDir & "\Icon.ico", 0)
GUICtrlSetState($nShowApp_TrayItem, $GUI_DEFBUTTON)
GUICtrlSetOnEvent($nShowApp_TrayItem, "Tray_Events")
;_TrayCreateItem("")
;_TrayItemSetIcon(-1, "", 0)
$nExitApp_TrayItem = _TrayCreateItem("Выйти из программы")
_TrayItemSetIcon(-1, "shell32.dll", 28)
GUICtrlSetOnEvent($nExitApp_TrayItem, "Tray_Events")
_SetTrayIconBkColor(0xC46200)
_SetTraySelectBkColor(0x087272)
_SetTraySelectTextColor(0xFFFFFF)
EndFunc
Func Main_Events()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
GUIDelete($hGUI)
_TrayIconDelete(-1)
_Exit_Proc()
Case $GUI_EVENT_MINIMIZE
GUISetState(@SW_HIDE)
_TrayIconSetState(1)
$hMsg_Wnd = 0
Case $nHide
GUISetState(@SW_HIDE)
_TrayIconSetState(1)
$hMsg_Wnd = 0
Case $nDriveEject_Button
Local $sSel_Index = _GUICtrlListView_GetSelectedIndices($hListView, 0)
Local $iSel_Index = Number($sSel_Index)
Local $sSel_Drive = _GUICtrlListView_GetItemText($hListView, $iSel_Index, 0)
If $sSel_Index = "" Then
MsgBox(48, "Внимание!", "Выберите устройство из списка.", 0, $hMsg_Wnd)
Else
DriveEject_Proc($sSel_Drive)
EndIf
Case $nConfirmEjection_CheckBox
$iConfirm_Drive_Ejection = Number(GUICtrlRead($nConfirmEjection_CheckBox) = $GUI_CHECKED)
EndSwitch
EndFunc