У меня схожая проблема, но без шпионских игр с прятками: 2 машины объединены роутером, раздающим интернет и uTorrent v2.2, забивающий весь канал.
Решил с помощью AHK, но не путём глобального регулирования трафика, а изменением максимальной скорости скачивания в самом торренте.
Идею взял достаточно давно, возможно на этом форуме, возможно на англоязычном http://www.autohotkey.com/. Так же использовал AHK: Доступ к памяти других процессов.
;Скрипт запускается на той машине, на которой необходимо ограничить скорость торрента.
;По сети проверяет .ini-файл, который создаётся и редактируется в ручную на другой машине
;и имеет вид:
;[main]
;Power=1 - флаг включения скрипта.
;[Torrent]
;Speed=500 - скорость в килобайтах.
#persistent
#NoTrayIcon
#singleinstance force
#NoEnv
SetTitleMatchMode 1
INIAdress =\\loolz\диск С на ноуте\RemoteControl.ini ;адрес .ini-файла
ProcessName = uTorrent.exe ;название процесса
WriteAddress = 0x004C60C4 ;адрес ограничения скорости в торренте
Size = 8 ;размер узнаётся так же, как и адрес
;немного допиленная функция из "Коллекции скриптов и идей"
WriteVar(WriteAddress,ID,Size,Data)
{
Address := WriteAddress ; Адрес, куда писать.
Data := Data ; Что писать.
Size := Size ; Сколько байт писать.
VarSetCapacity(Buf, Size, 0) ; Буфер, для записываемых данных.
NumPut(Data, Buf, 0, "UInt") ; Данные - в буфер.
PROCESS_VM_WRITE = 0x20 ; Права на процесс.
PROCESS_VM_OPERATION = 0x8
PID := ID
hProcess := DllCall("OpenProcess", "UInt", PROCESS_VM_WRITE | PROCESS_VM_OPERATION
, "Int", False
, "UInt", PID)
If(!hProcess) {
MsgBox, Не удалось открыть процесс.
ExitApp
}
Ret := DllCall("WriteProcessMemory", "UInt", hProcess
, "UInt", Address
, "UInt", &Buf
, "UInt", Size
, "UInt", 0)
DllCall("CloseHandle", "UInt", hProcess) ; Освобождение хэндла процесса.
If(!Ret) {
MsgBox, Не удалось записать.
ExitApp
}
}
;тело скрипта
SetTimer, FileCheck, 1000 ;раз в секунду считывает содержимое .ini-файла
FileCheck:
{
IniRead, Power, %INIAdress%, main, Power, 0
If ( Power = 0 ) ;если флаг включения не стоит
{
return ; выходим
}
IniRead, TorrentSpeed, %INIAdress%, Torrent, Speed, 0
Process, Exist, %ProcessName% ;проверяем наличие торрента
if ErrorLevel > 0
{
ID := ErrorLevel ;записываем его PID
WriteVar(WriteAddress,ID,Size,TorrentSpeed)
}
}
return
Для того, чтобы скрипт работал, необходим настроенный доступ к файлам по сети. На машине 1 создаётся .ini-файл вида:
[main]
Power=1 ; флаг включения скрипта.
[Torrent]
Speed=500 ; скорость в килобайтах (0 для отключения ограничения).
На машине 2 запускается скрипт и регулирует скорость торрента.
В ручную задаём скорость в .ini-файле, скрипт считывает значение и соответственно меняет скорость у торрента. Если нет возможности прочесть .ini-файл, по умолчанию ограничение снимается. Стоит ответить, что, возможно, в других версиях uTorrent адрес ограничения скорости будет изменён. Определяется он элементарно с помощью программы ArtMoney, переменная Size указана там же.