#NoTrayIcon #include #include #include #include #include ;============================================================================== AutoItSetOption("MustDeclareVars", 1) AutoItSetOption("TrayAutoPause", 0) AutoItSetOption("TrayMenuMode", 1) OnAutoItExitRegister("DetectarApagado") ; Variables inicializadas. Local $intErrorConfiguracion = 0 Local $intErrorParametros = 0 Local $str_RutaRed = "" Local $int_ErrorHotKeySet = 0 Local $int_ErrorModePrevio = 0 Local $int_ErrorModeAnterior = 0 Local $int_MensajeActual = 0 GLobal $int_NumeroEquiposRed = 0 Global $array_NombreEquiposRed[17] Global $ctrlid_OpcionAyuda Global $ctrlid_OpcionSalir Global $str_Carpeta = "" Global $hExplr Global $aSelection Global $oSelectedFolderItems $array_NombreEquiposRed[0] = "localhost" $array_NombreEquiposRed[1] = "" $array_NombreEquiposRed[2] = "" $array_NombreEquiposRed[3] = "" $array_NombreEquiposRed[4] = "" $array_NombreEquiposRed[5] = "" $array_NombreEquiposRed[6] = "" $array_NombreEquiposRed[7] = "" $array_NombreEquiposRed[8] = "" $array_NombreEquiposRed[9] = "" $array_NombreEquiposRed[10] = "" $array_NombreEquiposRed[11] = "" $array_NombreEquiposRed[12] = "" $array_NombreEquiposRed[13] = "" $array_NombreEquiposRed[14] = "" $array_NombreEquiposRed[15] = "" $array_NombreEquiposRed[16] = "" ; Función 'Main'. TraySetIcon ("AbrirExploradorHotKey.ico", 0) TraySetToolTip("Abrir carpetas equivalentes en la red con HotKey") $ctrlid_OpcionAyuda = TrayCreateItem("Ayuda") TrayCreateItem("") $ctrlid_OpcionSalir = TrayCreateItem("Cerrar") TraySetState(1) TrayItemSetState($ctrlid_OpcionAyuda, $TRAY_DEFAULT) $int_ErrorModePrevio = _WinAPI_SetErrorMode($SEM_FAILCRITICALERRORS) $int_ErrorModeAnterior = _WinAPI_SetErrorMode(BitOR($int_ErrorModePrevio, $SEM_FAILCRITICALERRORS)) $intErrorConfiguracion = LeerConfiguracion() If $intErrorConfiguracion <> 0 Then $int_ErrorModeAnterior = _WinAPI_SetErrorMode($int_ErrorModePrevio) Exit EndIf $int_ErrorHotKeySet = HotKeySet("^a", "AbrirExplorador_HotKey") If $int_ErrorHotKeySet <> 1 Then $int_ErrorModeAnterior = _WinAPI_SetErrorMode($int_ErrorModePrevio) Exit EndIf While 1 TrayItemSetState($ctrlid_OpcionAyuda, $TRAY_UNCHECKED) TrayItemSetState($ctrlid_OpcionSalir, $TRAY_UNCHECKED) $int_MensajeActual = TrayGetMsg() Select Case $int_MensajeActual = 0 ContinueLoop Case $int_MensajeActual = $ctrlid_OpcionAyuda TraySetClick(0) MsgBox(64, "AbrirExplorador - Ayuda", "Pulse Ctrl+A teniendo una ventana del Explorador abierta, en primer plano y mostrando una carpeta local, para abrir la carpeta equivalente en los equipos de red.", 300) TraySetClick(8) Case $int_MensajeActual = $ctrlid_OpcionSalir TraySetState(2) ExitLoop EndSelect WEnd $int_ErrorModeAnterior = _WinAPI_SetErrorMode($int_ErrorModePrevio) Exit ;=============================================================================== Func AbrirExplorador_HotKey() TraySetState(4) $intErrorParametros = LeerParametros() If $intErrorParametros <> 0 Then TraySetState(8) Return EndIf $str_RutaRed = StringReplace($str_Carpeta, ":", "", 1 , 0) For $indice_EquiposRed = 1 To $int_NumeroEquiposRed Step 1 If $array_NombreEquiposRed[$indice_EquiposRed] <> @ComputerName Then ShellExecute("\\" & $array_NombreEquiposRed[$indice_EquiposRed] & "\" & $str_RutaRed) EndIf Next TraySetState(8) Return EndFunc ;=============================================================================== Func LeerConfiguracion() ; Variables inicializadas. Local $int_Error = 0 Local $int_MasEquipos = 1 Local $int_Activado = 0 Local $str_Nombre = "" ; Paso 01 de 02: Leer opciones de configuración desde el Registro y restablecer errores. While $int_MasEquipos = 1 And $int_NumeroEquiposRed < 16 $int_Activado = RegRead("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Activado") If $int_Activado == "" Then Switch @error Case 1 $int_Error = 1 $int_Activado = 0 $str_Nombre = "" $int_MasEquipos = 0 RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador") RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Activado", "REG_DWORD", 0) RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Nombre", "REG_SZ", "NombreEquipoRed" & $int_NumeroEquiposRed+1) Case 2, 3 $int_Error = 2 $int_Activado = 0 $str_Nombre = "" $int_MasEquipos = 0 Case -1, -2 $int_Error = 1 $int_Activado = 0 $str_Nombre = "" $int_MasEquipos = 0 RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Activado", "REG_DWORD", 0) RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Nombre", "REG_SZ", "NombreEquipoRed" & $int_NumeroEquiposRed+1) Case Else $int_Error = 3 $int_Activado = 0 $str_Nombre = "" $int_MasEquipos = 0 EndSwitch ElseIf $int_Activado = 0 Then $int_MasEquipos = 0 ElseIf $int_Activado = 1 Then $str_Nombre = RegRead("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Nombre") if $str_Nombre == "" Then Switch @error Case 1 $int_Error = 1 $int_Activado = 0 $str_Nombre = "" $int_MasEquipos = 0 RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador") RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Activado", "REG_DWORD", 0) RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Nombre", "REG_SZ", "NombreEquipoRed" & $int_NumeroEquiposRed+1) Case 2, 3 $int_Error = 2 $int_Activado = 0 $str_Nombre = "" $int_MasEquipos = 0 Case -1, -2 $int_Error = 1 $int_Activado = 0 $str_Nombre = "" $int_MasEquipos = 0 RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Activado", "REG_DWORD", 0) RegWrite("HKCU\SOFTWARE\MiguelMS\AbrirExplorador", $int_NumeroEquiposRed+1 & "Nombre", "REG_SZ", "NombreEquipoRed" & $int_NumeroEquiposRed+1) Case Else $int_Error = 3 $int_Activado = 0 $str_Nombre = "" $int_MasEquipos = 0 EndSwitch Else $int_NumeroEquiposRed = $int_NumeroEquiposRed + 1 $array_NombreEquiposRed[$int_NumeroEquiposRed] = $str_Nombre $int_MasEquipos = 1 EndIf Else $int_Error = 4 $int_Activado = 0 $str_Nombre = "" $int_MasEquipos = 0 EndIf WEnd If $int_NumeroEquiposRed < 1 Or $int_NumeroEquiposRed > 16 Then $int_Error = 5 $int_NumeroEquiposRed = 0 EndIf ; Paso 02 de 02: Notificar posibles errores al usuario y retorno de la función. Switch $int_Error Case 0 Return 0 Case 1 MsgBox(16, "AbrirExplorador - Error", "La configuración de una o más opciones del programa no ha podido ser cargada y se ha restablecido a su valor predeterminado. Corrija la configuración en el Registro.", 300) Return 1 Case 2 MsgBox(16, "AbrirExplorador - Error", "La configuración de una o más opciones del programa no ha podido ser cargada debido a un error de acceso al Registro.", 300) Return 1 Case 4 MsgBox(16, "AbrirExplorador - Error", "La configuración de una o más opciones del programa tiene valores incorrectos. Corrija la configuración en el Registro.", 300) Return 1 Case 5 MsgBox(16, "AbrirExplorador - Error", "No hay equipos de red configurados en el Registro o hay más de 16 equipos de red configurados. Corrija la configuración en el Registro.", 300) Return 1 Case Else MsgBox(16, "AbrirExplorador - Error", "La configuración de una o más opciones del programa no ha podido ser cargada debido a un error desconocido.", 300) Return 1 EndSwitch EndFunc ;=============================================================================== Func LeerParametros() ; Variables inicializadas. Local $int_NumeroParametrosOK = 0 Local $int_ContenidoParametrosOK = 0 ; Paso 01 de 03: Intentar obtener el parámetro de la carpeta. $str_Carpeta = _ExClip() If $str_Carpeta <> "" Then $int_NumeroParametrosOK = 1 EndIf ; Paso 02 de 03: Verificar el parámetro recibidos. If $int_NumeroParametrosOK = 1 Then $int_ContenidoParametrosOK = FileExists($str_Carpeta) EndIf ; Paso 03 de 03: Notificar posibles errores al usuario y retorno de la función. If $int_NumeroParametrosOK <> 1 Then MsgBox(16, "AbrirExplorador - Error", "Se requiere que actualmente tenga abierta una carpeta local en una ventana del Explorador situada en primer plano.", 300) Return 1 EndIf If $int_ContenidoParametrosOK <> 1 Then MsgBox(16, "AbrirExplorador - Error", "La ruta local de carpeta " & $str_Carpeta & " no existe o no es accesible. Compruebe la carpeta actualmente abierta en la ventana activa del Explorador.", 300) Return 1 EndIf Return 0 EndFunc ;=============================================================================== Func DetectarApagado() If ((@ExitMethod = 3) or (@ExitMethod = 4)) Then TraySetState(2) EndIf EndFunc ;=============================================================================== ;=============================================================================== Func _ExClip() $hExplr = WinActive("[REGEXPCLASS:(Explore|Cabinet)WClass]") If $hExplr <> '' Then $aSelection = _ExplorerWinGetSelectedItems($hExplr) If $aSelection[0] = 0 Then Return($aSelection[1]) Else Return($aSelection[1]) EndIf EndIf EndFunc ; ========================================================================================================================== ; Func _ObjectSHFolderViewFromWin($hWnd) ; ; Returns an 'ShellFolderView' Object for the given Window handle ; ; Author: Ascend4nt, based on code by KaFu, klaus.s ; ========================================================================================================================== Func _ObjectSHFolderViewFromWin($hWnd) If Not IsHWnd($hWnd) Then Return SetError(1,0,0) Local $oShell,$oShellWindows,$oIEObject,$oSHFolderView ; Shell Object $oShell=ObjCreate("Shell.Application") If Not IsObj($oShell) Then Return SetError(2,0,0) ; Get a 'ShellWindows Collection' object $oShellWindows = $oShell.Windows() If Not IsObj($oShellWindows) Then Return SetError(3,0,0) ; Iterate through the collection - each of type 'InternetExplorer' Object For $oIEObject In $oShellWindows If $oIEObject.HWND = $hWnd Then ; InternetExplorer->Document = ShellFolderView object $oSHFolderView=$oIEObject.Document If IsObj($oSHFolderView) Then Return $oSHFolderView Return SetError(4,0,0) EndIf Next Return SetError(-1,0,0) EndFunc ; ========================================================================================================================== ; Func _ExplorerWinGetSelectedItems($hWnd) ; ; Author: klaus.s, KaFu, Ascend4nt (consolidation & cleanup, Path name simplification) ; ========================================================================================================================== Func _ExplorerWinGetSelectedItems($hWnd) If Not IsHWnd($hWnd) Then Return SetError(1,0,'') Local $oSHFolderView Local $iSelectedItems,$iCounter=2,$aSelectedItems[2] = [0, ""] $oSHFolderView=_ObjectSHFolderViewFromWin($hWnd) If @error Then Return SetError(@error,0,'') ; SelectedItems = FolderItems Collection object->Count $iSelectedItems = $oSHFolderView.SelectedItems.Count Dim $aSelectedItems[$iSelectedItems+2] ; 2 extra -> 1 for count [0], 1 for Folder Path [1] $aSelectedItems[0]=$iSelectedItems ; ShellFolderView->Folder->Self as 'FolderItem'->Path $aSelectedItems[1]=$oSHFolderView.Folder.Self.Path ; ShellFolderView->SelectedItems = FolderItems Collection object $oSelectedFolderItems = $oSHFolderView.SelectedItems #cs ; For ALL items in an Explorer Window (not just the selected ones): $oSelectedFolderItems = $oSHFolderView.Folder.Items ReDim $aSelectedItems[$oSelectedFolderItems.Count+2] #ce For $oFolderItem In $oSelectedFolderItems $aSelectedItems[$iCounter] = $oFolderItem.Path $iCounter += 1 Next Return SetExtended($iCounter-2,$aSelectedItems) EndFunc ;==>_ExplorerWinGetSelectedItems