From eae69b1ea59d4ec98040f07236be9d65e94cbe6b Mon Sep 17 00:00:00 2001 From: cyruz-git Date: Sat, 1 Aug 2015 22:33:38 +0200 Subject: [PATCH] New version, changed icons, new task scheduler code --- DropboxForRemovable.ahk | 528 ++++++++++++++++++++-------------------- DropboxForRemovable.ico | Bin 9662 -> 0 bytes res/icon.ico | Bin 0 -> 99678 bytes res/icon_red.ico | Bin 0 -> 5430 bytes res/icon_white.ico | Bin 0 -> 5430 bytes res/icon_yellow.ico | Bin 0 -> 5430 bytes 6 files changed, 269 insertions(+), 259 deletions(-) delete mode 100644 DropboxForRemovable.ico create mode 100644 res/icon.ico create mode 100644 res/icon_red.ico create mode 100644 res/icon_white.ico create mode 100644 res/icon_yellow.ico diff --git a/DropboxForRemovable.ahk b/DropboxForRemovable.ahk index 42e14db..93b1b69 100644 --- a/DropboxForRemovable.ahk +++ b/DropboxForRemovable.ahk @@ -1,15 +1,15 @@ ; ---------------------------------------------------------------------------------------------------------------------- ; Name .........: DropboxForRemovable -; Description ..: Dropbox helper that checks for a volume presence during Dropbox running. +; Description ..: Dropbox helper that controls the process according to the presence of a specific removable drive. ; AHK Version ..: AHK_L 1.1.13.01 x32/64 Unicode ; Author .......: Cyruz - http://ciroprincipe.info -; ..............: Tray icons from Kayamoon IcoMoon set: https://www.iconfinder.com/iconsets/Keyamoon-IcoMoon--limited -; ..............: The hex icons code is released under CC terms: http://creativecommons.org/licenses/by-sa/3.0/ +; ..............: Tray icons from Hawcons icon set: http://hawcons.com/. Thanks to Yannick Lung: http://www.yanlu.de/. ; Changelog ....: Dic. 27, 2013 - v0.1 - First revision. ; ..............: Jan. 02, 2014 - v0.2 - Changed behaviour, keep monitoring Dropbox in the long run. ; ..............: Jul. 21, 2014 - v0.3 - Removed monitoring and management of the Dropbox process. Now using polling -; ..............: to get the handle. Autostart through task scheduler. Uninstallation feature. +; ..............: to get the handle. Autostart through Task Scheduler. Uninstallation feature. ; ..............: Jul. 22, 2014 - v0.3.1 - Tracking of the Dropbox process to limit polling only when it's not running. +; ..............: Aug. 01, 2015 - v0.4 - New icons. Rewrite of the icons and task scheduler code. ; License ......: GNU Lesser General Public License ; ..............: This program is free software: you can redistribute it and/or modify it under the terms of the GNU ; ..............: Lesser General Public License as published by the Free Software Foundation, either version 3 of the @@ -22,66 +22,100 @@ ; ---------------------------------------------------------------------------------------------------------------------- #SingleInstance force -#Include +#Include +#Include +#Include +#Include #Include ; ===[ VARIABLES ]====================================================================================================== - DROPBOX_INI_CONF := "DropboxForRemovable.ini" - DROPBOX_VOL_FLAG := "DropboxForRemovable" - DROPBOX_SEC_WAIT := 3000 + DROPBOX_EXE := "Dropbox.exe" + SCRIPT_NAME := "DropboxForRemovable" + SCRIPT_VERSION := "0.4.0" + SCRIPT_ICON := "RES\ICON.ICO" ; Main icon. + SCRIPT_ICON_WHI := "RES\ICON_WHITE.ICO" ; Dropbox running tray icon. + SCRIPT_ICON_RED := "RES\ICON_RED.ICO" ; Dropbox suspended tray icon. + SCRIPT_ICON_YEL := "RES\ICON_YELLOW.ICO" ; Dropbox not running tray icon. + SCRIPT_VOL_FLAG := SCRIPT_NAME + SCRIPT_SEC_WAIT := 2000 + SCRIPT_ABOUT := SCRIPT_NAME " - Removable drives Dropbox helper - v." SCRIPT_VERSION "`n" + . "Created by Ciro Principe: http://ciroprincipe.info`n" + . "License under the terms of the GNU LGPL" ; ====================================================================================================================== -; Configure Tray menu. +; Get icon handles. +If ( A_IsCompiled ) +{ + pDataIcon := UpdRes_LockResource( 0, SCRIPT_ICON, 10, szDataIcon:="" ) + pDataIconWhi := UpdRes_LockResource( 0, SCRIPT_ICON_WHI, 10, szDataIconWhi:="" ) + pDataIconRed := UpdRes_LockResource( 0, SCRIPT_ICON_RED, 10, szDataIconRed:="" ) + pDataIconYel := UpdRes_LockResource( 0, SCRIPT_ICON_YEL, 10, szDataIconYel:="" ) +} +Else +{ ; We make the tray icon work also when running this script with the interpreter. + FileRead, cDataIcon, % "*c " A_ScriptDir "\" SCRIPT_ICON + FileRead, cDataIconWhi, % "*c " A_ScriptDir "\" SCRIPT_ICON_WHI + FileRead, cDataIconRed, % "*c " A_ScriptDir "\" SCRIPT_ICON_RED + FileRead, cDataIconYel, % "*c " A_ScriptDir "\" SCRIPT_ICON_YEL + pDataIcon := &cDataIcon, pDataIconWhi := &cDataIconWhi + , pDataIconRed := &cDataIconRed, pDataIconYel := &cDataIconYel +} +SCRIPT_HICO := BinGet_Icon( pDataIcon, 48 ) +SCRIPT_HICO_WHI := BinGet_Icon( pDataIconWhi, 16 ) +SCRIPT_HICO_RED := BinGet_Icon( pDataIconRed, 16 ) +SCRIPT_HICO_YEL := BinGet_Icon( pDataIconYel, 16 ) +cDataIconWht := cDataIconRed := cDataIconYel := "" ; Free buffers. + +; Remove tray menu, set traytip and script icon on startup. +; * Notice that the traytip setting must precede the icon +; * changing because it will restore the original one. Menu, Tray, NoStandard +Menu, Tray, Tip, %SCRIPT_NAME% +TrayIcon_Set( A_ScriptHwnd, 1028, SCRIPT_HICO_WHI, SCRIPT_HICO_WHI, SCRIPT_HICO ) + +; Connect to the Task Scheduler and get the root folder. +objServ := ComObjCreate( "Schedule.Service" ) +objServ.Connect(), objFold := objServ.GetFolder( "\" ) + +try ; * Check if the task exists, otherwise configure the software. + ; * The following method throws an exception in case of errors. + objFold.GetTask( "\" SCRIPT_NAME ) +catch +{ + If ( !A_IsAdmin ) + Auth_RunAsAdmin() + GoSub, SHOWCONFIG + Return +} + +; Exit if it is not started from the Task Scheduler. +nParIfn := Process_GetImageFileName( Process_GetParentPid( DllCall( "GetCurrentProcessId" ) ) ) +If ( !InStr( nParIfn, "taskeng.exe" ) ) +{ + MsgBox, 0x10, %SCRIPT_NAME%, DropboxForRemovable must be started from the appropriate scheduled task! + ExitApp +} + +; Configure Tray menu. Menu, Tray, Add, About, ABOUT Menu, Tray, Add, Uninstall, UNINSTALL Menu, Tray, Add Menu, Tray, Add, Quit, EXIT -Menu, Tray, Tip, DropboxForRemovable -; Set script icon for the first time. -UpdateScriptIcon(0) +; The volume to be monitored is passed as parameter by the Task Scheduler. +VOL_TO_MONITOR = %1% -; Configuration starting if the .ini file is not present. -If ( !FileExist(A_ScriptDir "\" DROPBOX_INI_CONF) ) { - ShellExecute := (A_IsUnicode) ? "Shell32.dll\ShellExecute" : "Shell32.dll\ShellExecuteA" - If ( !A_IsAdmin ) { - A_IsCompiled - ? DllCall( ShellExecute, UInt,0, Str,"RunAs", Str,"""" A_ScriptFullPath """", Ptr,0 , Str,A_WorkingDir, Int,1 ) - : DllCall( ShellExecute, UInt,0, Str,"RunAs", Str,"""" A_AhkPath """", Str,"""" A_ScriptFullPath """" - , Str,A_WorkingDir, Int,1 ) - ExitApp - } - GoSub, SHOWCONFIG -} -Else { - ; Exit if it is not started from the Task Scheduler. - sParam = %1% - If ( sParam != "/task" ) { - MsgBox, 0x10, DropboxForRemovable, DropboxForRemovable must be started from the appropriate scheduled task! - ExitApp - } - - ; Read and check settings. - IniRead, S_VOL, %A_ScriptDir%\%DROPBOX_INI_CONF%, SETTINGS, VOLUME_TO_MONITOR - IniRead, DROPBOX_SEC_WAIT, %A_ScriptDir%\%DROPBOX_INI_CONF%, SETTINGS, DROPBOX_WAIT_TIMER - If ( StrLen(S_VOL) != 1 ) { - MsgBox, 0x10, DropboxForRemovable, Volume not configured correctly! - ExitApp - } +; Check volume presence. +IS_VOL_READY := ( FileExist( VOL_TO_MONITOR ":\" SCRIPT_VOL_FLAG ) ) ? 1 : 0 - ; Check volume presence. - B_VOL_READY := (FileExist(S_VOL ":\" DROPBOX_VOL_FLAG)) ? 1 : 0 - - ; Monitor WM_DEVICECHANGE to catch device plug and unplug. - OnMessage(0x0219, "VolumeHandler") ; WM_DEVICECHANGE = 0x0219 - - ; Register callback to wait for Dropbox. - A_CALLBACK := RegisterCallback("TermNotifier") - - ; Set timer to check for the Dropbox process. - SetTimer, CHECKDROPBOX, %DROPBOX_SEC_WAIT% -} +; Monitor WM_DEVICECHANGE (0x0219) to catch device plugging and unplugging. +OnMessage( 0x0219, "VolumeHandler" ) + +; Register callback to wait for Dropbox. +aCallback := RegisterCallback( "TermNotifier", "Fast" ) + +; Set timer to check for the Dropbox process. +SetTimer, WAITDROPBOX, %SCRIPT_SEC_WAIT% Return @@ -89,246 +123,222 @@ Return ; ===[ LABELS ]========================================================================================================= ; ====================================================================================================================== - CHECKDROPBOX: +ABOUT: + MsgBox, 0x40, %SCRIPT_NAME%, %SCRIPT_ABOUT% + Return +;ABOUT + +WAITDROPBOX: + ; * If the Dropbox process is found running, a thread will be started to wait for its termination. + ; * This label is called only as a timer, so it will be shut off. If the monitored drive has been + ; * unplugged during the time that Dropbox was not running, Dropbox will be suspended when it will + ; * be catched. This strictly depends from the frequency of the polling. Critical - Process, Exist, Dropbox.exe - If ( ErrorLevel ) { - ; * If the Dropbox process is found running, a thread will be started to wait for - ; * its termination. This label is called only as a timer, so it will be shut off. - H_DROPBOX := DllCall( "OpenProcess", UInt,0x0001F0FFF, Int,0, UInt,ErrorLevel ) - If ( !B_VOL_READY ) { - ; * If the monitored drive has been unplugged during the time that Dropbox - ; * was not running, Dropbox will be suspended only when it will be catched. - ; * This strictly depends from the frequency of the polling. - DllCall( "ntdll.dll\NtSuspendProcess", Ptr,H_DROPBOX ) ; Suspend Dropbox process. - OBJ_TRAY := TrayIcon_GetInfo("Dropbox.exe") - TrayIcon_Hide(OBJ_TRAY[1].idcmd, OBJ_TRAY[1].place, True) ; Hide Dropbox icon. - TrayTip, DropboxForRemovable, Dropbox found and suspended..., 10, 1 - } Else - TrayTip, DropboxForRemovable, Dropbox found..., 10, 1 - DllCall( "RegisterWaitForSingleObject", PtrP,hWait, Ptr,H_DROPBOX, Ptr,A_CALLBACK, Ptr,0, UInt,0xFFFFFFFF - , UInt,0x00000004|0x00000008 ) - B_DROPBOX_RUNNING := 1 + Process, Exist, %DROPBOX_EXE% + If ( ErrorLevel ) + { + ; Get a handle to the Dropbox process and wait for its termination. + ; PROCESS_ALL_ACCESS = 0x0001F0FFF. + hDropbox := DllCall( "OpenProcess", UInt,0x0001F0FFF, Int,0, Ptr,ErrorLevel ) + ; INFINITE = 0xFFFFFFFF, WT_EXECUTEONLYONCE = 0x00000008. + DllCall( "RegisterWaitForSingleObject", PtrP,hWait, Ptr,hDropbox, Ptr,aCallback + , Ptr,0, UInt,0xFFFFFFFF, UInt,0x00000008 ) + DllCall( "CloseHandle", Ptr,hDropbox ) + + ; Update Dropbox tray info object. + While ( !IsObject( DROPBOX_TRAY_OBJ := TrayIcon_GetInfo( DROPBOX_EXE ) ) ) + Sleep, 1000 ; This while/sleep is required because Dropbox tray isn't updated quickly. + + If ( !IS_VOL_READY ) + DropboxToggle( 0, "Dropbox found and suspended..." ) + Else + { + TrayIcon_Set( A_ScriptHwnd, 1028, SCRIPT_HICO_WHI ) + TrayTip, %SCRIPT_NAME%, Dropbox found..., 10, 1 + } + + IS_DROPBOX_RUNNING := 1 SetTimer, %A_ThisLabel%, Off } Return -;CHECKDROPBOX - - WAITDROPBOX: - TrayTip, DropboxForRemovable, Dropbox terminated. Waiting for it..., 10, 1 - B_DROPBOX_RUNNING := 0 - SetTimer, CHECKDROPBOX, %DROPBOX_SEC_WAIT% - Return ;WAITDROPBOX - SHOWCONFIG: - DriveGet, S_DRIVE, List, REMOVABLE - S_DRIVE_LIST := RegExReplace(S_DRIVE, "([\w])(?=[\w])", "$1|") - Gui, Margin, 20, 20 - Gui, Add, Text, w120, Volume to monitor: - Gui, Add, DropDownList, vDDLIST_1 w250 y+10, %S_DRIVE_LIST% - Gui, Add, Button, vBUTTON_1 gREFRESH w80 x+5, Refresh - Gui, Add, Button, vBUTTON_3 gCONFIGURE w80 x+-165 y+20, Configure - Gui, Add, Button, vBUTTON_4 gGUICLOSE w80 x+5, Exit - Gui, Show, AutoSize, DropboxForRemovable - Return -;SHOWCONFIG - - REFRESH: - DriveGet, S_DRIVE, List, REMOVABLE - S_DRIVE_LIST := RegExReplace(S_DRIVE, "([\w])(?=[\w])", "$1|") - GuiControl,, DDLIST_1, |%S_DRIVE_LIST% - Return -;REFRESH - - CONFIGURE: +CONFIGURE: + Gui, +OwnDialogs Gui, Submit, NoHide - If ( !DDLIST_1 ) { - MsgBox, 0x10, DropboxForRemovable, No volume to monitor selected. + If ( !DDLIST_1 ) + { + MsgBox, 0x10, %SCRIPT_NAME%, No volume selected. Return } - IniWrite, %DDLIST_1%, %A_ScriptDir%\%DROPBOX_INI_CONF%, SETTINGS, VOLUME_TO_MONITOR - IniWrite, %DROPBOX_SEC_WAIT%, %A_ScriptDir%\%DROPBOX_INI_CONF%, SETTINGS, DROPBOX_WAIT_TIMER - FileAppend,, %DDLIST_1%:\%DROPBOX_VOL_FLAG% - FileSetAttrib, +RSH, %DDLIST_1%:\%DROPBOX_VOL_FLAG% - ; Create a task scheduler item to automatically start the program on boot. - S_COMMAND := ( A_IsCompiled ) ? A_ScriptFullPath : A_AhkPath - S_ARGUMENT := ( A_IsCompiled ) ? "/task" : """" A_ScriptFullPath """ /task" - FileAppend, - ( - - - - %A_YYYY%-%A_MM%-%A_DD%T%A_Hour%:%A_Min%:%A_Sec%.%A_MSec% - %A_ComputerName%\%A_UserName% - - - - true - %A_ComputerName%\%A_UserName% - - - - - %A_ComputerName%\%A_UserName% - InteractiveToken - HighestAvailable - - - - IgnoreNew - false - false - false - true - false - - false - false - - true - true - false - false - false - PT0S - 7 - - PT1M - 3 - - - - - %S_COMMAND% - %S_ARGUMENT% - - - - ), temp.xml - S_CMD := "schtasks /Create /XML """ A_ScriptDir "\temp.xml"" /TN ""DropboxForRemovable""" - RunWait, % COMSPEC " /c """ S_CMD """",, Hide - FileDelete, temp.xml - MsgBox, 0x40, DropboxForRemovable, Task configured. Starting it... - S_CMD := "schtasks /Run /TN ""DropboxForRemovable""" - RunWait, % COMSPEC " /c """ S_CMD """",, Hide + + ; Get the volume label and create the flag file inside it. + VOL_TO_MONITOR := DDLIST_1 + FileAppend,, %VOL_TO_MONITOR%:\%SCRIPT_VOL_FLAG% + FileSetAttrib, +RSH, %VOL_TO_MONITOR%:\%SCRIPT_VOL_FLAG% + + ; Create a new task definition object. + objTask := objServ.NewTask( 0 ) + ; Get the RegistrationInfo object to change task information. + objInfo := objTask.RegistrationInfo + objInfo.Description := "DropboxForRemovable starter task" + objInfo.Author := A_UserName + + ; Get the Principal object to change credential related information. + objPrin := objTask.Principal + objPrin.LogonType := 3 ; TASK_LOGON_INTERACTIVE_TOKEN + objPrin.RunLevel := 1 ; TASK_RUNLEVEL_HIGHEST + + ; Get the TaskSettings object to change all task settings. + objSett := objTask.Settings + objSett.Enabled := 1 ; Enable the task. + objSett.DisallowStartIfOnBatteries := 0 ; Unflag "Start the task only if the computer is on AC power". + objSett.StopIfGoingOnBatteries := 0 ; Unflag "Stop if the computer switches to battery power". + objSett.AllowDemandStart := 1 ; Allow task to be run on demand. + objSett.StartWhenAvailable := 1 ; Run the task as soon as possible after a scheduled start is missed. + objSett.RestartInterval := "PT1M" ; If the task fails, restart every 1 minutes. + objSett.RestartCount := 3 ; Attempt to restart up to 3 times. + objSett.ExecutionTimeLimit := "PT0S" ; Stop the task if it runs longer than 1 hour. + + ; Get the Trigger object to add a trigger to the task. + colTrig := objTask.Triggers + objTrig := colTrig.Create(9) ; Logon type trigger = 2 + objTrig.Enabled := 1 ; Enable the trigger. + + ; Get the Action object to add an action to the task. + colActi := objTask.Actions + objActi := colActi.Create(0) ; TASK_ACTION_EXEC + objActi.Path := ( A_IsCompiled ) ? """" A_ScriptFullPath """" : """" A_AhkPath """" + objActi.Arguments := ( A_IsCompiled ) ? VOL_TO_MONITOR : """" A_ScriptFullPath """ " VOL_TO_MONITOR + + ; Register the task. TASK_CREATE_OR_UPDATE = 6, TASK_LOGON_INTERACTIVE_TOKEN = 3 + objFold.RegisterTaskDefinition( SCRIPT_NAME, objTask, 6, "", "", 3 ) + + MsgBox, 0x40, %SCRIPT_NAME%, Task configured. Starting it... + objTask := objFold.GetTask( "\" SCRIPT_NAME ) + objTask.Run( 0 ) + ExitApp ;CONFIG - UNINSTALL: - MsgBox, 0x24, DropboxForRemovable, Are you sure you want to uninstall? +DUMMY: + FileInstall, RES\ICON.ICO, DUMMY + FileInstall, RES\ICON_WHITE.ICO, DUMMY + FileInstall, RES\ICON_RED.ICO, DUMMY + FileInstall, RES\ICON_YELLOW.ICO, DUMMY +;DUMMY + +EXIT: + Gui, +OwnDialogs ; Avoid showing the AutoHotkey icon on the taskbar. + MsgBox, 0x24, %SCRIPT_NAME%, Are you sure you want to quit? IfMsgBox, No Return - FileDelete, %A_ScriptDir%\%DROPBOX_INI_CONF% - S_CMD := "schtasks /Delete /TN ""DropboxForRemovable"" /F" - RunWait, % COMSPEC " /c """ S_CMD """",, Hide - MsgBox, 0x40, DropboxForRemovable, Uninstalled! + ; Unregister the waiting thread and stop the task. + DllCall( "UnregisterWait", Ptr,hWait ) + objTask.Stop( 0 ) +GUICLOSE: ExitApp -;UNINSTALL +;GUICLOSE +;EXIT - ABOUT: - MsgBox, 0x40, DropboxForRemovable, % "DropboxForRemovable - Removable drives Dropbox helper`n" - . "Created by Ciro Principe: http://ciroprincipe.info`n" - . "License under the terms of the GNU GPL" +NOTIFYDROPBOX: + TrayIcon_Set( A_ScriptHwnd, 1028, SCRIPT_HICO_YEL ) + TrayTip, %SCRIPT_NAME%, Dropbox terminated. Waiting for it..., 10, 1 + IS_DROPBOX_RUNNING := 0 + SetTimer, WAITDROPBOX, %SCRIPT_SEC_WAIT% Return -;ABOUT +;NOTIFYDROPBOX + +REFRESH: + DriveGet, sDrive, List, REMOVABLE + sDriveList := RegExReplace( sDrive, "([\w])(?=[\w])", "$1|" ) + GuiControl,, DDLIST_1, |%sDriveList% + Return +;REFRESH - EXIT: - MsgBox, 0x24, DropboxForRemovable, Are you sure you want to quit? - IfMsgBox, Yes - GUICLOSE: +SHOWCONFIG: + DriveGet, sDrive, List, REMOVABLE + sDriveList := RegExReplace( sDrive, "([\w])(?=[\w])", "$1|" ) + + Gui, +HwndhGui + Gui, Margin, 20, 20 + Gui, Add, Text, w120, Volume to monitor: + Gui, Add, DropDownList, vDDLIST_1 w250 y+10, %sDriveList% + Gui, Add, Button, vBUTTON_1 gREFRESH w80 x+5, Refresh + Gui, Add, Button, vBUTTON_3 gCONFIGURE w80 x+-165 y+20, Configure + Gui, Add, Button, vBUTTON_4 gGUICLOSE w80 x+5, Exit + Gui, Show, AutoSize, %SCRIPT_NAME% + + SendMessage, 0x80, 0, SCRIPT_HICO,, ahk_id %hGui% + SendMessage, 0x80, 1, SCRIPT_HICO,, ahk_id %hGui% + Return +;SHOWCONFIG + +UNINSTALL: + Gui, +OwnDialogs ; Avoid showing the AutoHotkey icon on the taskbar. + MsgBox, 0x24, %SCRIPT_NAME%, Are you sure you want to uninstall? + IfMsgBox, No + Return + + ; Unregister the waiting thread, stop the task and delete it. + DllCall( "UnregisterWait", Ptr,hWait ) + objTask.Stop( 0 ) + objFold.DeleteTask( "\" SCRIPT_NAME, 0 ) + + MsgBox, 0x40, %SCRIPT_NAME%, Uninstalled! ExitApp -;GUICLOSE -;EXIT +;UNINSTALL ; ====================================================================================================================== ; ===[ FUNCTIONS ]====================================================================================================== ; ====================================================================================================================== -VolumeHandler(wParam, lParam, uMsg, hWnd) { +DropboxToggle(bStatus, sMsg) +{ + Global SCRIPT_NAME, SCRIPT_HICO_WHI, SCRIPT_HICO_RED, DROPBOX_EXE, DROPBOX_TRAY_OBJ + + Process, Exist, %DROPBOX_EXE% + If ( !ErrorLevel ) + Return + + hDropbox := DllCall( "OpenProcess", UInt,0x0001F0FFF, Int,0, Ptr,ErrorLevel ) + DllCall( "ntdll.dll\Nt" ( bStatus ? "Resume" : "Suspend" ) "Process", Ptr,hDropbox ) + DllCall( "CloseHandle", Ptr,hDropbox ) + + TrayIcon_Hide( DROPBOX_TRAY_OBJ[1].idcmd, DROPBOX_TRAY_OBJ[1].place, !bStatus ) + TrayIcon_Set( A_ScriptHwnd, 1028, ( bStatus ? SCRIPT_HICO_WHI : SCRIPT_HICO_RED ) ) + TrayTip, %SCRIPT_NAME%, %sMsg%, 10, 1 +} + +TermNotifier() +{ + ; * Get notified of Dropbox termination and give back control + ; * to the primary thread to wait for the new Dropbox process. + SetTimer, NOTIFYDROPBOX, -1 + Return +} + +VolumeHandler(wParam, lParam, uMsg, hWnd) +{ Critical - Global B_VOL_READY, S_VOL, DROPBOX_VOL_FLAG, B_DROPBOX_RUNNING, H_DROPBOX + Global IS_DROPBOX_RUNNING, IS_VOL_READY, VOL_TO_MONITOR, SCRIPT_VOL_FLAG, DROPBOX_TRAY_OBJ ; * It's better to wait for DBT_DEVNODES_CHANGED (0x0007) events and check if ; * the volume is still present, because the DBT_DEVICEREMOVECOMPLETE will not ; * be sent when unplugging the device with the "remove device" feature. So we ; * will return quickly if the event is not DBT_DEVNODES_CHANGED. If ( wParam != 0x0007 ) Return - If ( B_VOL_READY && !FileExist(S_VOL ":\" DROPBOX_VOL_FLAG) ) { - If ( B_DROPBOX_RUNNING ) { - DllCall( "ntdll.dll\NtSuspendProcess", Ptr,H_DROPBOX ) ; Suspend Dropbox process. - , OBJ_TRAY := TrayIcon_GetInfo("Dropbox.exe") - , TrayIcon_Hide(OBJ_TRAY[1].idcmd, OBJ_TRAY[1].place, True) ; Hide Dropbox icon. - TrayTip, DropboxForRemovable, Dropbox suspended..., 10, 1 - } - B_VOL_READY := 0 - , UpdateScriptIcon(1) ; Set script suspended icon. + If ( IS_VOL_READY && !FileExist( VOL_TO_MONITOR ":\" SCRIPT_VOL_FLAG ) ) + { + If ( IS_DROPBOX_RUNNING ) + DropboxToggle( 0, "Dropbox suspended..." ) + IS_VOL_READY := 0 } - Else If ( !B_VOL_READY && FileExist(S_VOL ":\" DROPBOX_VOL_FLAG) ) { - If ( B_DROPBOX_RUNNING ) { - DllCall( "ntdll.dll\NtResumeProcess", Ptr,H_DROPBOX ) ; Resume Dropbox process. - , OBJ_TRAY := TrayIcon_GetInfo("Dropbox.exe") - , TrayIcon_Hide(OBJ_TRAY[1].idcmd, OBJ_TRAY[1].place, False) ; Unhide Dropbox icon. - TrayTip, DropboxForRemovable, Dropbox resumed..., 10, 1 - } - B_VOL_READY := 1 - , UpdateScriptIcon(0) ; Set script normal icon. + Else If ( !IS_VOL_READY && FileExist( VOL_TO_MONITOR ":\" SCRIPT_VOL_FLAG ) ) + { + If ( IS_DROPBOX_RUNNING ) + DropboxToggle( 1, "Dropbox resumed..." ) + IS_VOL_READY := 1 } - OBJ_TRAY := "" - Return -} - -TermNotifier() { - ; * Get notified of Dropbox termination and give back control - ; * to the primary thread to wait for the new Dropbox process. - SetTimer, WAITDROPBOX, -1 Return -} - -UpdateScriptIcon(bSuspended) { - Static hNormalIcon := IconData_Create("" - . "0000010001001010000001002000680400001600000028000000100000002000000001002000000000000000000000000000000000000000" - . "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - . "0000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - . "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - . "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - . "ffffffffff9fffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - . "ffffffffffffffffff600000000000000000ffffff60ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - . "ffffffffffffffffffefffffff3000000000000000000000000000000000ffffff30ffffffefffffffffffffffffffffffffffffffffffff" - . "ffffffffffffffffffffffffffafffffff10000000000000000000000000000000000000000000000000ffffff10ffffffcfffffffffffff" - . "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffff" - . "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000ffff" - . "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000" - . "000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - . "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - . "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9fffffffffffff" - . "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f0000" - . "0000ffffff9fffffffefffffff300000000000000000000000000000000000000000000000000000000000000000ffffff30ffffffefffff" - . "ff9f000000000000000000000000ffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - . "ffffffffff9f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - . "00000000000000000000000000000000000000000000ffffac410000ac410000ac410000ac410180ac4103c0ac4107e0ac4103c0ac4103c0" - . "ac4103c0ac410000ac410000ac410000ac418ff1ac41c003ac41ffffac4") - , hSuspendedIcon := IconData_Create("" - . "0000010001001010000001002000680400001600000028000000100000002000000001002000000000000000000000000000000000000000" - . "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - . "00000000000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000" - . "FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000" - . "FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000" - . "FFFF0000FF9F0000FF9F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000" - . "FFFF0000FFFF0000FF6000000000000000000000FF600000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000" - . "FFFF0000FFFF0000FFEF0000FF30000000000000000000000000000000000000FF300000FFEF0000FFFF0000FFFF0000FFFF0000FFFF0000" - . "FFFF0000FFFF0000FFFF0000FFAF0000FF100000000000000000000000000000000000000000000000000000FF100000FFCF0000FFFF0000" - . "FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF000000000000000000000000000000000000FFFF0000FFFF0000" - . "FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF000000000000000000000000000000000000" - . "FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000000000000000" - . "0000000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000" - . "FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000" - . "FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF9F0000FFFF0000" - . "FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF9F0000" - . "00000000FF9F0000FFEF0000FF3000000000000000000000000000000000000000000000000000000000000000000000FF300000FFEF0000" - . "FF9F0000000000000000000000000000FF9F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000" - . "FFFF0000FF9F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - . "00000000000000000000000000000000000000000000FFFFAC410000AC410000AC410000AC410180AC4103C0AC4107E0AC4103C0AC4103C0" - . "AC4103C0AC410000AC410000AC410000AC418FF1AC41C003AC41FFFFAC4") - (bSuspended) ? IconData_Set(hSuspendedIcon) : IconData_Set(hNormalIcon) } \ No newline at end of file diff --git a/DropboxForRemovable.ico b/DropboxForRemovable.ico deleted file mode 100644 index 913b1967562134118c1552d1471b365eca7ad42d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9662 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 Gw*Lov1PO5f literal 0 HcmV?d00001 diff --git a/res/icon_red.ico b/res/icon_red.ico new file mode 100644 index 0000000000000000000000000000000000000000..e71d1084157b797947d5de5f4bcf460b838cd696 GIT binary patch literal 5430 zcmeHLK~4fe5Nw3Vg+wl*CPp_Nh&K(y09Vgo2*~d+d6VQ-$KkdkAwV0_ksK|u(LdT z#rTZ;Mf%J^V^C2i?;U#J(q_IPrVjma;2y^0_0eYyw0oGkzdQl6SW}Uv)#{VxR6pEX>PV4}r?0<6_GojF z({GV$8h(J@v4)HPQ?y|bY#sko{Nq_l(Aw|XK>U?9hwry0p7+;GkBR2#GdY9$OU+-1 z*~NAC_gkWQ`Yhh#Iy63krnljK`s`bmN59##D^VOX}et}w^KTGEZVrAYB vhUwmQ4^E%+J@wxH8#9XEYJc{AKZe+Ffc?!X zH-W5%rFBw+eAejiojb9A=$R%6|2gntt6<`a&&EZ(E4e0%IQO6~6Hk09aTz?5 zT$4pg&sM|46Q7NX_!D640sb!V45&-AOjad&3Yv7q=Se~>BU&b_5WE>)e7;q=rrLc#xDR|+)BxA*Yx*2R&bT7| zu}yoWA3*=Za}QiED5JmXVSxOFryjV@pscp!fiv->KarX)7TRs#YtJ5--*(Z>=Yl)h zQ-74N*X%bZAhVqlg+>Ika4sL-8}hhD-k-nzAv$F&h%SDKZW(w1z2_WW{69qph=4l& zr&y{weJ5yby_}fK~Z#I5GZtK!FKY@Y^hH`&w zx4N@Ck^~v7r`R6@gSIki1!K}ZT`T|@Yp{v{y{&(Lxd`V*Ayz~p@M%J8=}Bo5Znc?oMGuhZq234V!# zwRB#>n#k*PIc9=i;$SVEm#`-CI^9i)nOL91k+xO|Ya+kN`f0VTBZvD}+eD8OIgmeX z9s6B%gxFCcUfA0N+=%$o^eKlNO@U|8XXK`&J;{HnGV1pX*U$sx&7?o=K^?D!v5^|4 zJoT*FJP);7M)Z+~IrDgYmfA)A!ICu$h$oM3bZ)H^UM-_f_$Xg7p6`JAJB9$3*2;Zr z$Uhou<`G3S9zFjC*drSQ9RC1ZlHm*J4b7p0zEf1t9JF zoqQ<^?^#c=8a>XFkL483KcD5F)efG=-`~7hUWb?WBhz>f*O1+Uuwl6V?AlakTtCnA zg=XK#`FzlduARr&zbyNE@_jqQ{%rcbtCa5srGM+(`Yu^CHa9N&ZlBEZUBdnXokF69 literal 0 HcmV?d00001