Existe uma maneira de bloquear um aplicativo (como o iTunes) programaticamente?

0

Eu sincronizei minha biblioteca do iTunes com um Win7 Desktop, um MacBook e um NAS.

Inicialmente, parece uma boa ideia, porque minhas músicas / vídeos foram sincronizados em todos os dispositivos e estão disponíveis off-line quando estou em movimento com o meu MacBook. No entanto, isso apresentou um problema - conflito.

Se eu tiver mais de um iTunes aberto a qualquer momento, há um conflito, porque eles não funcionam bem juntos. Então eu preciso lembrar de ter apenas um iTunes aberto em qualquer momento. Além disso, preciso aguardar até que o processo de sincronização esteja concluído em ambos os dispositivos, entre alternar minha área de trabalho e o laptop.

Eu preciso de algum tipo de script que possa:

  1. Lembre o usuário com uma caixa de confirmação quando ele tentar abrir o iTunes; ou
  2. Bloqueie a capacidade de abrir o iTunes até que toda a sincronização esteja concluída; ou
  3. Aplique integridade de token / chave, em que apenas um dispositivo terá uma chave em um determinado ponto. Com esta chave, o usuário pode abrir o iTunes. Isso pode simplesmente ser um booleano em um arquivo de texto. Ou talvez a presença do arquivo de texto seja suficiente.

Minha pergunta é: o que posso usar para fazer alguma das situações acima? Não sei por onde começar e quais aplicativos estão disponíveis que podem me ajudar a fazer isso.

    
por user3804927 15.10.2014 / 08:41

1 resposta

0

Após algumas pesquisas, descobri uma maneira de automatizar isso no Windows 7: AutoHotKey

Eu escrevi um script para criar um arquivo de texto para sincronizar com o NAS enquanto o iTunes é aberto. Esse arquivo de texto é uma chave exclusiva do computador que o abre e só será criado / removido quando o computador em questão estiver "online" para garantir a integridade.

#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 isso ajude alguém. Agora estou procurando uma solução Mac OSX. Eu farei algumas pesquisas no Automator para ver se possível. Se alguém tiver outra solução, compartilhe.

    
por 19.10.2014 / 10:45