Есть ли способ заблокировать приложение (например, iTunes) программно?


0

Я синхронизировал свою библиотеку iTunes с Win7 Desktop, MacBook и NAS.

Поначалу это кажется хорошей идеей, потому что моя музыка / видео синхронизировались на всех устройствах и доступны в автономном режиме, когда я в пути с моим MacBook. Однако это представляет проблему - конфликт.

Если у меня одновременно открыто несколько iTunes, возникает конфликт, потому что они не очень хорошо играют вместе. Поэтому мне нужно помнить, чтобы в любой момент времени был открыт только один iTunes. Кроме того, мне нужно дождаться завершения процесса синхронизации на обоих устройствах, между переключением моего настольного компьютера и ноутбука.

Мне нужен какой-то скрипт, который будет либо:

  1. Напомните пользователю окно подтверждения при попытке открыть iTunes; или же
  2. Заблокируйте возможность открывать iTunes до полной синхронизации; или же
  3. Обеспечить целостность токена / ключа, когда только одно устройство будет иметь ключ в любой заданной точке. С помощью этого ключа пользователь может открыть iTunes. Это может быть просто логическое значение в текстовом файле. Или, возможно, наличие текстового файла достаточно.

Мой вопрос - что я могу использовать, чтобы сделать что-либо из вышеперечисленного? Я не знаю, с чего начать и какие приложения доступны, которые могут помочь мне сделать это.


Вы можете использовать Home Sharing? «Главный» Mac в моем доме настроен с помощью функции «Домашний обмен», а «клиентские» компьютеры Mac и ATV получают весь контент iTunes с главного устройства. Это работает для просмотра, но не позволяет редактировать библиотеку iTunes - для этого вам все равно придется перейти на главный Mac (или ПК).
Jimtut

Ответы:


0

После некоторых исследований я нашел способ автоматизировать это в Windows 7: AutoHotKey

Я написал скрипт для создания текстового файла для синхронизации с NAS, когда iTunes открыт. Этот текстовый файл является ключом, уникальным для открывающего его компьютера, и будет создаваться / удаляться только в том случае, если рассматриваемый компьютер находится «в сети» для обеспечения целостности.

#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

Я надеюсь, что это поможет кому-то еще. Сейчас я ищу решение для Mac OSX. Я буду делать некоторые исследования на Automator, чтобы увидеть, если это возможно. Если у кого-то есть другое решение, пожалуйста, поделитесь.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.