¿Hay una manera de bloquear una aplicación (como iTunes) mediante programación?

0

He sincronizado mi biblioteca de iTunes con un escritorio Win7, un MacBook y un NAS.

Inicialmente, parece una buena idea porque mi música / videos se sincronizaron en todos los dispositivos y están disponibles sin conexión cuando estoy de viaje con mi MacBook. Sin embargo, esto presentaba un problema - conflicto.

Si tengo más de un iTunes abierto en un momento dado, hay un conflicto, porque no juegan bien juntos. Así que debo recordar tener solo un iTunes abierto en un momento dado. Además de esto, debo esperar hasta que el proceso de sincronización se complete en ambos dispositivos, entre el cambio de mi computadora de escritorio y mi computadora portátil.

Necesito algún tipo de script que:

  1. Recuérdele al usuario con un cuadro de confirmación cuando intente abrir iTunes; o
  2. Bloquea la capacidad de abrir iTunes hasta que se complete toda la sincronización; o
  3. Imponga la integridad del token / clave, donde solo un dispositivo tendrá una clave en un punto determinado. Con esta tecla, el usuario puede abrir iTunes. Esto podría ser simplemente un booleano en un archivo de texto. O tal vez la presencia del archivo de texto sea suficiente.

Mi pregunta es: ¿Qué puedo usar para hacer cualquiera de los anteriores? No sé por dónde empezar y qué aplicaciones están disponibles que me pueden ayudar a hacer esto.

user3804927
fuente
¿Puedes usar Home Sharing? La Mac "maestra" de mi casa está configurada con Home Sharing, y las Mac y ATV "cliente" recogen todo el contenido de iTunes del maestro. Esto funciona para la visualización, pero no le permite editar la biblioteca de iTunes; todavía tiene que ir a la Mac (o PC) maestra para eso.
jimtut

Respuestas:

0

Después de algunas investigaciones, encontré una forma de automatizar esto en Windows 7: AutoHotKey

He escrito una secuencia de comandos para crear un archivo de texto para sincronizar con el NAS mientras se abre iTunes. Este archivo de texto es una clave exclusiva de la computadora que lo abre y solo se creará o eliminará cuando la computadora en cuestión esté "en línea" para garantizar la integridad.

#NoTrayIcon
; the only way to keep integrity is to make sure that everything is synced before creating or deleting key
; if there is no key, only create one when there is internet connection, which is a safe bet that it is synced.

NodeNam = www.google.com
IPs := HostToIp(NodeName)
DllCall("Ws2_32\WSACleanup") ; always inlude this line after calling to release the socket connection

IfNotExist, %A_WorkingDir%\*Key.txt
{
    if IPs <> -1
        FileAppend, This file represents iTunes key`n, %A_WorkingDir%\Win7Key.txt ;Msgbox, %NodeName%`n%IPs%
}


;if the right key exist, allow iTunes to run, and delete key only if internet is available
IfExist, %A_WorkingDir%\Win7Key.txt
{
  Run, "C:\Program Files (x86)\iTunes\iTunes.exe"
  winWait, iTunes
  winWaitClose
  if IPs <> -1
    FileDelete, %A_WorkingDir%\Win7Key.txt
}

;checks if internet is available by querying www.google.com
HostToIp(NodeName) ; returns -1 if unsuccessful or a newline seperated list of valid IP addresses
{
    VarSetCapacity(wsaData, 32)  ; The struct is only about 14 in size, so 32 is conservative.
    result := DllCall("Ws2_32\WSAStartup", "UShort", 0x0002, "UInt", &wsaData) ; Request Winsock 2.0 (0x0002)
    if ErrorLevel   ; check ErrorLevel to see if the OS has Winsock 2.0 available:
    {
        MsgBox WSAStartup() could not be called due to error %ErrorLevel%. Winsock 2.0 or higher is required.
        return -1
    }
    if result  ; Non-zero, which means it failed (most Winsock functions return 0 on success).
    {
        MsgBox % "WSAStartup() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") ; %
        return -1
    }
    PtrHostent := DllCall("Ws2_32\gethostbyname", str, Nodename)
    if (PtrHostent = 0) 
        Return -1 
    VarSetCapacity(hostent,16,0) 
    DllCall("RtlMoveMemory",UInt,&hostent,UInt,PtrHostent,UInt,16)  
    h_addr_list := ExtractInteger(hostent,12,false,4)  
    VarSetCapacity(AddressList,12,0) 
    DllCall("RtlMoveMemory",UInt,&AddressList,UInt,h_addr_list,UInt,12) 
    Loop, 3 
    { 
       offset := ((A_Index-1)*4) 
       PtrAddress%A_Index% := ExtractInteger(AddressList,offset,false,4) 
       If (PtrAddress%A_Index% =0) 
          break 
       VarSetCapacity(address%A_Index%,4,0) 
       DllCall("RtlMoveMemory" ,UInt,&address%A_Index%,UInt,PtrAddress%A_Index%,Uint,4) 
       i := A_Index 
       Loop, 4 
       { 
          if Straddress%i% 
             Straddress%i% := Straddress%i% "." ExtractInteger(address%i%,(A_Index-1 ),false,1) 
          else 
             Straddress%i% := ExtractInteger(address%i%,(A_Index-1 ),false,1) 
       }
        Straddress0 = %i%
    }
    loop, %Straddress0% ; put them together and return them
    {
        _this := Straddress%A_Index%
        if _this <>
            IPs = %IPs%%_this%
        if A_Index = %Straddress0%
            break
        IPs = %IPs%`n
    }
    return IPs
} 
ExtractInteger(ByRef pSource, pOffset = 0, pIsSigned = false, pSize = 4)
{ 
    Loop %pSize% 
      result += *(&pSource+pOffset+A_Index-1) << 8*A_Index-8 
    Return result 
}

ExitApp

Espero que esto ayude a alguien más. Ahora estoy buscando una solución Mac OSX. Voy a hacer una investigación sobre Automatizador para ver si es posible. Si alguien más tiene alguna otra solución, por favor comparta.

user3804927
fuente