Перейти к содержанию
СофтФорум - всё о компьютерах и не только

AutoHotKey - скриптовый язык программирования


Рекомендуемые сообщения

Если кому-то нужно объяснить поподробней то можно созвониться в Skype

ну по сути то звонить не нужно, как и оверквотингом (Оверквотинг — Википедия) не надо баловаться ;)

 

Вот скрипт, он просто большой из-за моих комментариев :mrgreen:

;Мне нужно чтоб он кликал туда автоматически без клика,когда на кнопку идёт сигнал(звонок)./* ===============================================================================Вот желаемое, правда писал немного шаблонно, т.е. без особенных наворотов )))) Протестировал, всё работает Только с кликом мышки могут быть проблемы================================================================================ */ ;-----Инициализация; Скрипт не выгружается#Persistent; Отключить иконку в трее; Иконка будет, что можно было контролировать;#NoTrayIcon  - убрать ; что бы она появилась; Запрет повторного запуска - что бы случано два раза не кликнуть по иконке/ярлыку#SingleInstance; Точка выхода OnExit, lEndSCRfRepty  := True ; Флаг защиты от повторного кликаcDelayR := 1000 ; Время отработки 1000  мс = 1 секунда;#UseHook, On - не обязательно#If WinActive("Такси-ангел SIP телефония"); Если окно активно, то работает секция от сих до дерективы #IfWinActiveSetTitleMatchMode, 2/*1: заголовок окна должен начинаться со значения, заданного в WinTitle 2: заголовок окна должен содержать значение, заданное в WinTitle 3: заголовок окна должен совпадать со значением, заданным в WinTitleСоветую написать  #If WinActive("Такси-ангел")При SetTitleMatchMode, 2 Этого будет более чем достаточно*/;mbutton:: - не нужно;WinActivate, Такси-ангел SIP телефония - сделал иначе  Sleep, 25  If (!fRepty)      Return  fRepty := False  MouseClick, left, 245, 148 ; координаты можно уточнять, но это поже  Gosub sDelayR ; Уходим из секции, что бы сработало в любом случаее  fRepty  := Truereturn;#UseHook, Off - не обязательно#IfWinActivesDelayR:  Sleep %cDelayR%  fRepty  := True  Sleep, 50ReturnlEndSCR:  ExitApp

Правда я не понял фразу

когда на кнопку идёт сигнал(звонок)

Это про что? ;)

Надеюсь не на MButton - средняя кнопка мыши (или колесо) :mrgreen:

 

Хотя... но тогда я твой начальный пример не понимаю - ты просто блокируешь MButton

Ладно разберёмся :)

 

Исходники, что бы не копировать мышкой

Для Vladislav123321 (ANSI).txt

Для Vladislav123321 (UTF-8).txt

Для Vladislav123321 (ANSI).txt

Для Vladislav123321 (UTF-8).txt

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

@Vladislav123321 Ну и зачем я всё писал то - скачиваний = 0, т.е. зачем просил помочь то?

Ссылка на комментарий
Поделиться на другие сайты

Аксакал извини,не мог зайти!!!
Всё супер,только так как я чайник в скриптах ты можешь мне готовый скрипт дать,а скайп для того чтоб я мог спросить что к чему!)

Ссылка на комментарий
Поделиться на другие сайты

@Vladislav123321, твой ник Скайпа мне в ЛС, мой ник прописан в профиле.

Ссылка на комментарий
Поделиться на другие сайты

У меня в программу идёт звонок,далее мне нужно кликнуть на колесико чтоб я ответил на него,НО помимо меня есть ещё ребята которые так же как и я берут эти звонки.
Мне хотелось чтоб AHK без моего вмешательства брал трубку.Это возможно?)
Помощь очень нужна :surrender: 

Заранее спасибо!)

Ссылка на комментарий
Поделиться на другие сайты

@Vladislav123321, твой ник Скайпа мне в ЛС, мой ник прописан в профиле.

Вот картинка,и координаты.   

Безымянный.bmp

Безымянный111.png

Безымянный.bmp

post-120417-0-53859700-1421773123_thumb.

Ссылка на комментарий
Поделиться на другие сайты

@Vladislav123321,  пронял, сижу пишу, как напишу....  файл будет в аттаче

 

ЖДИ ;)

Ссылка на комментарий
Поделиться на другие сайты

@Форматцевт,

 Помоги написать программу, "Перебиватор"

 

Отвечу/сделаю чуть позже , т.к.  с задачей для @Vladislav123321, не так всё просто, как казалось на первый взгляд.

Изменено пользователем Форматцевт
Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

Извиняюсь, что если кому то не ответил, пропустил вопрос или же просто не помог  — я же всё же человек.




 
И так.
Расширенная и унифицированная версия скрипта из поста № 45



Прелюдия
 
Как показала практика, для большинства программ, а особенно игр  —  требуется закрытие приложений. Хорошо что если их мало  —  у меня их около 8 штук.
И так получается, что бы что то запустить надо что то закрыть, при чём то что мы хотим закрыть просто так не закрывается.
 
Значит будем работать с командой  —  taskkill /F /IM NAME.exe
 
Часть №1 (Предопределения)
;-----Инициализация; Скрипт не выгружается#Persistent; Запрет повторного запуска#SingleInstance ignoreOnExit, lEndProgram                       ;Метка точки выхода#Include C:\AHK\Include\                  ; Устанавливаем путь к файлам скрипта#Include CloseNetWorkApps.ahk             ; Закрытие мешающих сетевых приложений командой taskkill /F /IM NAME.exe#Include RunCon.ahk                       ; Запуск с консоли

Тут всё понятно и много комментариев
 
 
Часть №2 (Что можно было сделать лучше)

  arNetApps :=  [["taskkill /F /IM pidgin.exe",""]                ,["taskkill /F /IM uTorrent.exe",""]                ,["taskkill /F /IM thunderbird.exe",""]                ,["",""]]; Производим закрытие; 1-й параметр это тайм-аут в секундах окна диагностики; 2-й параметр это ссылка на массив, он должен быть всегда последним!!!; Имя массива может быть любое, но действительное. В этом варианте это массив arNetApps  fnCloseNetWorkApps(3,arNetApps*)

Массив arNetApps можно считывать из текстового файла, но я поленился, да и особой необходимости в этом у меня не возникло - проще дополнить скрипт и перекомпилировать.
 

Цикл чтения файла полезен в случаях, когда вы хотите обработать каждую строку текстового файла по очереди. Он работает быстрее, чем команда FileReadLine, потому что: 1) файл может оставаться открытым в течение всей операции; и 2) нет необходимости каждый раз снова сканировать файл в поисках строки с нужным номером.
Встроенная переменная A_LoopReadLine существует внутри любого цикла чтения файла. Она содержит текст текущей строки, за исключением символов возврата каретки и перевода строки, отмечающих концы строк. Если цикл чтения файла находится внутри другого такого же цикла, текущая строка внутреннего цикла будет иметь преимущество.
Могут считываться строки длиной до 65534 символов. Если длина строки больше этой, её остаток будет считан в следующей итерации цикла.
Внутри цикла чтения файла часто используются команда StringSplit или цикл разбора, чтобы разбирать содержимое каждой строки, извлекаемой из InputFile. Например, если каждая строка в InputFile состоит из полей, разделённых табуляцией, эти поля могут извлекаться по отдельности, как в этом примере:
Loop, read, C:\Database Export.txt
{
Loop, parse, A_LoopReadLine, %A_Tab%
{
MsgBox, Поле номер %A_Index%: %A_LoopField%.
}
}

Для загрузки целого файла в переменную используйте команду FileRead, так как она работает быстрее, чем цикл (особенно для больших файлов).
Чтобы одновременно открыть несколько файлов, следуйте примеру, приведённому в описании команды DllCall.
Смотрите в описании команды Loop информацию о блоках кода, командах Break, Continue и переменной A_Index (которая существует во всех типах циклов).

 
 
Концовка(Но я обычно этим не ограничиваюсь)

lEndProgram:  ExitApp

Скрипт для игры Sacred 2 Gold  for Win7

;-----Инициализация; Скрипт не выгружается#Persistent; Запрет повторного запуска#SingleInstance ignoreOnExit, lEndSacred2#Include C:\AHK\Include\                  ; Устанавливаем путь к файлам скрипта#Include CloseNetWorkApps.ahk             ; Закрытие мешающих сетевых приложений командой taskkill /F /IM NAME.exe#Include RunCon.ahk                       ; Запуск с консоли  arNetApps :=  [["taskkill /F /IM pidgin.exe",""]                ,["taskkill /F /IM uTorrent.exe",""]                ,["taskkill /F /IM thunderbird.exe",""]                ,["",""]]  fnCloseNetWorkApps(3,arNetApps*) ; Производим закрытие   fKeyFn    :=  True        ;Блок симуляция Fn+ПКМ при fKeyFn := True  keyAtt    :=  "F6"  keyMove   :=  "Up"  keyView   :=  "MButton"   ;Стандартная клавиша, описание не требуется  keyEnter  :=  "Enter"     ;Стандартная клавиша, описание не требуется  ; chkExt := 1  fnTray()  fEmulAtack  := False  fMoveView   := False  fChat       := False  vDelayBase  := 25  vDelayTwo   := 35  vDelay100   := 100  vDelayClick := 350  vDelay50    := 50   vDelay10    := 10; Таймер поворота границ  fTwist      :=  True  ;Блокиратор поворота по клавише PrintScreen  cAreaX      :=  50  vMinX       :=  cAreaX  vMaxX       := 1920 - cAreaX   cRatePeriodTwist := 125  vDelayHold  := 50 ;cRatePeriodTwist//3  ;SetTimer  lTimerTwist, %cRatePeriodTwist%; Тут запустить таймер проверки игры  cRatePeriod := 5000 ;раз в N-секунд (1000 = 1 сек)  ;cRateExitPeriod := 15000 ;раз в N-секунд (1000 = 1 сек)  ;Run, C:\TLB\Games\Sacred 2 Gold.lnk ;[, WorkingDir, Max|Min|Hide|UseErrorLevel, OutputVarPID]  ;Sleep %vDelayClick%  SetTimer  lTimerTest, %cRatePeriod%  ;CoordMode, Mouse, ScreenReturnlEndSacred2:  ExitApp#UseHook, On#If WinActive("Sacred")SetTitleMatchMode, 2;****************************************lTimerTest:  if (WinActive("Sacred"))          {            ;SetTimer      lTimerTwist,    %cRatePeriodTwist%            ;Hotkey,       %keyAtt%, 	  	lEmulAtack,  			On            ;if (!fTwist)            ;      Hotkey, %keyMove%,   		lMoveView,  			On            Hotkey,       %keyEnter%, 		lChat,      			On            }    Else  {            fTwist      :=  True            ;SetTimer      lTimerTwist, Off            ;Hotkey,       %keyAtt%, 	  	lEmulAtack,  			Off            ;Hotkey,       %keyMove%,   		lMoveView,  			Off            ;Hotkey,       %keyView%, 	  	lBlockMidM,  			Off            Hotkey,       %keyEnter%, 		lChat,      			Off                }Return;---------------------------------------- ;Симуляция Fn+ПКМ и после ЛКМ~F1::~F2::~F3::~F4::~F5::   If (!fKeyFn) ; Если ЛОЖЬ то не выполняем и выходим.          Return   ;Sleep %vDelayBase%   Click, Right   Sleep %vDelayClick%   Click, Right   ;Sleep %vDelayClick%Return;----------------------------------------;Блокировка входа в чатlChat:  if (fChat)      {        Return ; Блокировка повторного входа      }    Else      {        fChat := True      };Тут пишем клавишу замены, если нужно.        Send, {LCtrl Down}  Sleep %vDelay50%	while (GetKeyState(keyEnter, "P"))    {      Click      Sleep %vDelay50%		}  Send, {LCtrl Up}  fChat := FalseReturn;----------------------------------------;Движение + ОбзорlMoveView:  If (GetKeyState(keyView, "P"))        Return      if (fMoveView)      {        Return ; Блокировка повторного входа      }    Else      {        fMoveView := True      }  Hotkey, %keyView%, 	  	lBlockMidM,  			On      Send, {%keyMove% Down}{%keyView% Down}	while (GetKeyState(keyMove, "P"))    {      Sleep %vDelay10%		}  Send, {%keyMove% Up}{%keyView% Up}  fMoveView := False  Hotkey, %keyView%, 	  	lBlockMidM,  			OfflBlockMidM:Return;----------------------------------------;Атака на местеlEmulAtack:  if (fEmulAtack)      {        Return ; Блокировка повторного входа      }    Else      {        fEmulAtack := True      }  Sleep %vDelayTwo%  Send, {LCtrl Down}{LButton Down}  Sleep %vDelayBase% 	while (GetKeyState(keyAtt, "P"))    {      Sleep %vDelayBase%		}  Sleep %vDelayBase%  Send, {LCtrl Up}{LButton Up}  Sleep %vDelayTwo%  fEmulAtack := FalseReturn;****************************************PrintScreen::  ;fTwist := !fTwistReturnlTimerTwist:  if (fTwist)        Return  CoordMode, Mouse, Screen  MouseGetPos, OutputVarX, OutputVarY  If (OutputVarX < vMinX)        {          Send, {Left Down}            Sleep %vDelayHold%          Send, {Left  Up}        Return        }  If (OutputVarX > vMaxX)        {          Send, {Right Down}            Sleep %vDelayHold%          Send, {Right  Up}        Return        } Return#UseHook, Off#IfWinActivefnTray(){global ;Установки трея для скрипта    Menu1  := "Справка"    Menu2  := "Выход"    Menu, tray, NoStandard  ; меню в трее будет не стандартным - своим            ;Добавляем пункт меню по ПКМ      Menu, tray, add, %Menu1%, AboutScript      Menu, tray, add  ;Разделитель        Menu, tray, add, %Menu2%, lEndSacred2                 ; Задаём свою выноску "балон"      Menu, tray, tip, ——Обработка клавиш——`n        Для Sacred 2 Gold`n`nАвтор: Indomito©`n       ;: `n  - приложений `n  - игр `n  - и т.д. `n `n;      Menu, tray, default, %Menu1%  ; Этот пункт меню по умолчанию двойной щелчёк ЛКМ по иконке в трее для его вызова;      Menu, Tray, Click, 1          ; Переназначаем двойной на одиночный ЛКМReturn}AboutScript:  vMsgOptionsOK   :=0+4096+64  txtHelp := "`n1. F6    - сочетание Ctrl+ЛКМ с автоповтором."  txtHelp := txtHelp "`n2. Enter - блокировка чата/замена на другую клавишу."  txtHelp := txtHelp "`n3. UP    - сочетание Up+СКМ."  txtHelp := txtHelp "`n4. PrintScreen    - блокиратор автоповорота."  msgbox, % vMsgOptionsOK          ,Sacred 2 Keys to AHK          ,`n`n`nПерехват и виртулизация нажатий клавиш`n %txtHelp%          ,25Return

 

 

 

Приложение

 

Компилировать я не стал, так у меня одно закрывается, что явно не будет совпадать с вашими потребностями.

 

Содержимое папки C:\AHK\Include\            Include.zip

Усечённый основной файл для Gothic 3     Gothic3Key.zip

 


Всем успехов с написанием скриптов

 

Gothic3Key.zip

Include.zip

Изменено пользователем Форматцевт
  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

И так скрипт TrioKeys.ahk   —  одна клавиша три разных действия. т.е. нажимаем LShift, но он на примере игры "The Witcher 2 - Assassins of Kings":

  • Одиночное нажатие достать серебряный меч
  • Двойное нажатие достать стальной меч
  • Убрать оружие

Переназначить можно что угодно + связать два действия - клавиша UP(стрелка вперёд)

  • Одиночное нажатие  —  уклонение вперёд
  • Двойное нажатие  —  кувырок вперёд
  • Удержание  — бег вперёд

Я этого делать не стал, а то в скрипте и так "чёрт ногу сломит" )))

 

Скрипт написан для игр в основном, что бы не заморачиваться с геймпадом/джойстиком и у кого нет многофункциональной клавиатуры или мышки, но и для работы с приложениями он тоже пригодится.
 




Описание
;==============Подпрограмма - Три действия/клавиши в одной======================;  сBaseKey              :=         ; Нажимаемая клавиша;  cAloneKey             :=         ; 1-я Виртуальная клавиша;  cDoubleKey            :=         ; 2-я Виртуальная клавиша;  cHoldingKey           :=         ; 3-я Виртуальная клавиша;--------------Оптимальное значение для игр и мышки на опыте игры "The Witcher 2 - Assassins of Kings";  сPause_PressKey       := 350    ; Если пауза меньше этого количества миллисекунд, то нажатие двойное. Если больше, то оно расценивается как 2 одиночных;  cWaitHoldingBaseKey   := 2      ; Время ожидания в цикле определения удержания за каждый шаг, при больших значениях блокирует одиночное/двойное нажатие.;  cCountHoldingBaseKey  := 25     ; Число шагов цикла для определения удержание клавиши/кнопки, при больших значениях блокирует одиночное/двойное нажатие.;  cWaitVirtualKey       := 10     ; Время задержки между эмуляцией нажатия на клавиши/кнопки подмены реально нажатой клавишей/кнопкой.;  fAutoRepeat           := false  ; Автоповтор реально нажатой клавиши/кнопки - включён/выключен True/False

 
Код для работы с мечами

RShift::    сBaseKey              := "RShift"  cAloneKey             := "sc10"     ;Q - Серебрянный меч  cDoubleKey            := "sc11"     ;W - Стальной меч  cHoldingKey           := "sc12"   ;E - Убрать оружие    сPause_PressKey       := 300     cWaitHoldingBaseKey   := 1       cCountHoldingBaseKey  := 40     cWaitVirtualKey       := 5      cWaitBaselKey         := 10  fAutoRepeat           := false   gosub sbTrioProcessingKeysreturn

 
Подпрограмма обработки sbTrioProcessingKeys

 

;==============Подпрограмма - Три действия/клавиши в одной======================;  сBaseKey              :=         ; Нажимаемая клавиша;  cAloneKey             :=         ; 1-я Виртуальная клавиша;  cDoubleKey            :=         ; 2-я Виртуальная клавиша;  cHoldingKey           :=         ; 3-я Виртуальная клавиша;--------------Оптимальное значение для игр и мышки на опыте игры "The Witcher 2 - Assassins of Kings";  сPause_PressKey       := 350    ; Если пауза меньше этого количества миллисекунд, то нажатие двойное. Если больше, то оно расценивается как 2 одиночных;  cWaitHoldingBaseKey   := 2      ; Время ожидания в цикле определения удержания за каждый шаг, при больших значениях блокирует одиночное/двойное нажатие.;  cCountHoldingBaseKey  := 25     ; Число шагов цикла для определения удержание клавиши/кнопки, при больших значениях блокирует одиночное/двойное нажатие.;  cWaitVirtualKey       := 10     ; Время задержки между эмуляцией нажатия на клавиши/кнопки подмены реально нажатой клавишей/кнопкой.;  fAutoRepeat           := false  ; Автоповтор реально нажатой клавиши/кнопки - включён/выключен True/FalseEnter::      сBaseKey              := "Enter"  cAloneKey             := "Enter"   ; Действия по Enter  cDoubleKey            := "Space"   ; Взять всё  cHoldingKey           := "LButton"  сPause_PressKey       := 300     cWaitHoldingBaseKey   := 1       cCountHoldingBaseKey  := 40     cWaitVirtualKey       := 5      cWaitBaselKey         := 10  fAutoRepeat           := false  gosub sbTrioProcessingKeysreturn          RCtrl::      сBaseKey              := "RCtrl"    cAloneKey             := "RCtrl"  ;Следующий предмет  cDoubleKey            := "End"    ;Задействовать скилл "Изпользовать адреналин для массового уничтожения"  cHoldingKey           := "RCtrl"  ;Следующий предмет  сPause_PressKey       := 300     cWaitHoldingBaseKey   := 1       cCountHoldingBaseKey  := 40     cWaitVirtualKey       := 5      cWaitBaselKey         := 10  fAutoRepeat           := false  gosub sbTrioProcessingKeysreturn;Numpad0 - что бы всегда срабатывал Медальон, в игре проблема обработки, видимо задержка ожидания нажатия.sc52::        сBaseKey              := "sc52"   ;Numpad0  cAloneKey             := "sc52"   ;Медальон  cDoubleKey            := "sc52"   ;Медальон  cHoldingKey           := "sc52"   ;Медальон  сPause_PressKey       := 300     cWaitHoldingBaseKey   := 1       cCountHoldingBaseKey  := 40     cWaitVirtualKey       := 5      cWaitBaselKey         := 10  fAutoRepeat           := false  gosub sbTrioProcessingKeysreturnRShift::    сBaseKey              := "RShift"  cAloneKey             := "sc10"     ;Q - Серебрянный меч  cDoubleKey            := "sc11"     ;W - Стальной меч  cHoldingKey           := "sc12"   ;E - Убрать оружие    сPause_PressKey       := 300     cWaitHoldingBaseKey   := 1       cCountHoldingBaseKey  := 40     cWaitVirtualKey       := 5      cWaitBaselKey         := 10  fAutoRepeat           := false  gosub sbTrioProcessingKeysreturn;------------Начало работы      #UseHook, OnsbTrioProcessingKeys:; Требуется реализация блокировки от входа с разных клавиш, т.е. защита от множественного входа на време отработки этой подпрограммы.  vCountHoldingBaseKey:=cCountHoldingBaseKey  ;Проверка на удержание нажатия/клика клавиши/кнопки  while ((GetKeyState(сBaseKey, "P")) && vCountHoldingBaseKey && (!сSecond_PressKey))      {        sleep %cWaitHoldingBaseKey%           vCountHoldingBaseKey--      }  if (!vCountHoldingBaseKey)      {  ; Нормальное удержание не работает, нужно не посылать код отжатия, пока нажата реальная клавиша - в подпрограмме sbAutoRepeat треуется корректировка (починил... почти, возможны коллизии)  ; Надо сделать режим удерживать или нет клавишу, а это ввод второго флага, может быть для всех трёх клавиш.    ;Cделано, не требуется.        Send, {%cHoldingKey% Down}  ;Удержание нажатия/клика клавиши/кнопки        Sleep %cWaitVirtualKey%            Send, {%cHoldingKey% Up}        Gosub sbAutoRepeat        return      }     else        Gosub, sbPressCountKeysreturn            ; Конец обработки подпрограммы sbStartProcessingKeys;Одиночное нажатие/клик клавиши/кнопкиsbAloneKey:  Send, {%cAloneKey% Down}  Sleep %cWaitVirtualKey%      Send, {%cAloneKey% Up}  Gosub sbAutoRepeatReturn;Двойное нажатие/клик клавиши/кнопкиsbDoubleKey:  Send, {%cDoubleKey% Down}  Sleep %cWaitVirtualKey%      Send, {%cDoubleKey% Up}    Gosub sbAutoRepeatReturn;Без/С автоповтором основной клавиши/кнопкиsbAutoRepeat:  if (!fAutoRepeat)      {        Send, {%сBaseKey% Down}   ; Без автоповтора        ;while (GetKeyState(сBaseKey, "P"))        KeyWait, %сBaseKey%  ;Sleep %cWaitBaselKey%        Send, {%сBaseKey% Up}            }Return                            ; C автоповторомsbPressCountKeys:  If not сSecond_PressKey      {        сSecond_PressKey := 1        SetTimer, sbDoublePressKey, -%сPause_PressKey%      }    Else      {        сSecond_PressKey := 0        SetTimer, sbDoubleKey, -1      }ReturnsbDoublePressKey:  If not сSecond_PressKey        Return  сSecond_PressKey := 0  SetTimer, sbAloneKey, -1Return;-----------------------------------------------------------------#UseHook, Off


 
Скрипт целиком

 

;-----Инициализация;Скрипт не выгружается до явного определения#Persistent;Запрет повторного запуска#SingleInstance  IgnoreOnExit, lEnd_TrioKeysReturnlEnd_TrioKeys:ExitApp ; Требуется условия выхода#If WinActive("Имя окна приложения")  ; Окно должено содержать это значение, например "Witcher"SetTitleMatchMode, 2#IfWinActive ;Эта детектива должна быть самой последней  после дерективы #UseHook, Off;****************************************;==============Подпрограмма - Три действия/клавиши в одной======================;  сBaseKey              :=         ; Нажимаемая клавиша;  cAloneKey             :=         ; 1-я Виртуальная клавиша;  cDoubleKey            :=         ; 2-я Виртуальная клавиша;  cHoldingKey           :=         ; 3-я Виртуальная клавиша;--------------Оптимальное значение для игр и мышки на опыте игры "The Witcher 2 - Assassins of Kings";  сPause_PressKey       := 350    ; Если пауза меньше этого количества миллисекунд, то нажатие двойное. Если больше, то оно расценивается как 2 одиночных;  cWaitHoldingBaseKey   := 2      ; Время ожидания в цикле определения удержания за каждый шаг, при больших значениях блокирует одиночное/двойное нажатие.;  cCountHoldingBaseKey  := 25     ; Число шагов цикла для определения удержание клавиши/кнопки, при больших значениях блокирует одиночное/двойное нажатие.;  cWaitVirtualKey       := 10     ; Время задержки между эмуляцией нажатия на клавиши/кнопки подмены реально нажатой клавишей/кнопкой.;  fAutoRepeat           := false  ; Автоповтор реально нажатой клавиши/кнопки - включён/выключен True/FalseEnter::      сBaseKey              := "Enter"  cAloneKey             := "Enter"   ; Действия по Enter  cDoubleKey            := "Space"   ; Взять всё  cHoldingKey           := "LButton"  сPause_PressKey       := 300     cWaitHoldingBaseKey   := 1       cCountHoldingBaseKey  := 40     cWaitVirtualKey       := 5      cWaitBaselKey         := 10  fAutoRepeat           := false  gosub sbTrioProcessingKeysreturn          RCtrl::      сBaseKey              := "RCtrl"    cAloneKey             := "RCtrl"  ;Следующий предмет  cDoubleKey            := "End"    ;Задействовать скилл "Изпользовать адреналин для массового уничтожения"  cHoldingKey           := "RCtrl"  ;Следующий предмет  сPause_PressKey       := 300     cWaitHoldingBaseKey   := 1       cCountHoldingBaseKey  := 40     cWaitVirtualKey       := 5      cWaitBaselKey         := 10  fAutoRepeat           := false  gosub sbTrioProcessingKeysreturn;Numpad0 - что бы всегда срабатывал Медальон, в игре проблема обработки, видимо задержка ожидания нажатия.sc52::        сBaseKey              := "sc52"   ;Numpad0  cAloneKey             := "sc52"   ;Медальон  cDoubleKey            := "sc52"   ;Медальон  cHoldingKey           := "sc52"   ;Медальон  сPause_PressKey       := 300     cWaitHoldingBaseKey   := 1       cCountHoldingBaseKey  := 40     cWaitVirtualKey       := 5      cWaitBaselKey         := 10  fAutoRepeat           := false  gosub sbTrioProcessingKeysreturnRShift::    сBaseKey              := "RShift"  cAloneKey             := "sc10"     ;Q - Серебрянный меч  cDoubleKey            := "sc11"     ;W - Стальной меч  cHoldingKey           := "sc12"   ;E - Убрать оружие    сPause_PressKey       := 300     cWaitHoldingBaseKey   := 1       cCountHoldingBaseKey  := 40     cWaitVirtualKey       := 5      cWaitBaselKey         := 10  fAutoRepeat           := false  gosub sbTrioProcessingKeysreturn;------------Начало работы      #UseHook, OnsbTrioProcessingKeys:; Требуется реализация блокировки от входа с разных клавиш, т.е. защита от множественного входа на време отработки этой подпрограммы.  vCountHoldingBaseKey:=cCountHoldingBaseKey  ;Проверка на удержание нажатия/клика клавиши/кнопки  while ((GetKeyState(сBaseKey, "P")) && vCountHoldingBaseKey && (!сSecond_PressKey))      {        sleep %cWaitHoldingBaseKey%           vCountHoldingBaseKey--      }  if (!vCountHoldingBaseKey)      {  ; Нормальное удержание не работает, нужно не посылать код отжатия, пока нажата реальная клавиша - в подпрограмме sbAutoRepeat треуется корректировка (починил... почти, возможны коллизии)  ; Надо сделать режим удерживать или нет клавишу, а это ввод второго флага, может быть для всех трёх клавиш.    ;Cделано, не требуется.        Send, {%cHoldingKey% Down}  ;Удержание нажатия/клика клавиши/кнопки        Sleep %cWaitVirtualKey%            Send, {%cHoldingKey% Up}        Gosub sbAutoRepeat        return      }     else        Gosub, sbPressCountKeysreturn            ; Конец обработки подпрограммы sbStartProcessingKeys;Одиночное нажатие/клик клавиши/кнопкиsbAloneKey:  Send, {%cAloneKey% Down}  Sleep %cWaitVirtualKey%      Send, {%cAloneKey% Up}  Gosub sbAutoRepeatReturn;Двойное нажатие/клик клавиши/кнопкиsbDoubleKey:  Send, {%cDoubleKey% Down}  Sleep %cWaitVirtualKey%      Send, {%cDoubleKey% Up}    Gosub sbAutoRepeatReturn;Без/С автоповтором основной клавиши/кнопкиsbAutoRepeat:  if (!fAutoRepeat)      {        Send, {%сBaseKey% Down}   ; Без автоповтора        ;while (GetKeyState(сBaseKey, "P"))        KeyWait, %сBaseKey%  ;Sleep %cWaitBaselKey%        Send, {%сBaseKey% Up}            }Return                            ; C автоповторомsbPressCountKeys:  If not сSecond_PressKey      {        сSecond_PressKey := 1        SetTimer, sbDoublePressKey, -%сPause_PressKey%      }    Else      {        сSecond_PressKey := 0        SetTimer, sbDoubleKey, -1      }ReturnsbDoublePressKey:  If not сSecond_PressKey        Return  сSecond_PressKey := 0  SetTimer, sbAloneKey, -1Return;-----------------------------------------------------------------#UseHook, Off


 
 
Даю только исходник -  в скрипте большая завязка на имя окна, условие завершения и на сами клавиши TrioKeys.zip

 



 

Всем удачи, надеюсь я не "накосячил", т.к. скрипт был выдран из другого скрипта

Основанная ошибка может быть связана с расположение директив #If WinActive() #IfWinActive и #UseHook, On/Off

TrioKeys.zip

Изменено пользователем Форматцевт
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Немного для почтовой программы   Mozilla Thunderbird



 

Я использую этот почтовик не из любви к продуктам/софту  Mozilla Foundation , но имея 50—75 почтовых ящиков, да мне столько нужно, то почтовик надо настраивать не стандартно, то есть править частично код, что то дописывать к нему.
 
Просто не могу использовать Microsoft Outlook/Outlook Express или иной, т.к.  они много чего не умеют, а если и делают то что мне нужно, то криво... спорить не буду - нет смысла.
И конечно что бы WEB интерфейс использовать уж точно не хватит времени, причем не все они сообщаю о почте + требуют много манипуляций для прочтения/получения/отправки оной.
 
Большим недостатком было то что Mozilla Thunderbird плохо уходил в трей, надо было нажимать или Х или F9, но в первый сложно попасть, а на второй надо нажимать + оба работали не со %100 гарантией срабатывания.
Пришлось взяться сразу за два языка AHK(для скрипта авто-запуска с авто-закрытием в трей и просто авто-закрытия в трей для кнопки на JS) и JS(для получения достаточно большой кнопки с функционалом)
 
Как все сисадмины я просто ленив - проще написать, чем нажимать лишний раз. :mrgreen: 
 
Все откомпилированные скрипты находятся в C:\Program Files (x86)\Mozilla Thunderbird\ - так проще IMHO
 
 

Скрипт запуска - ThunderbirdStartHide.ahk

; Скрытие Thunderbird в трей при запуске  SetTitleMatchMode, 2  Run, C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe  Sleep 5000 ;5 секунд на отработку почтовика  ToolTip  loop 10    {      SetTitleMatchMode, 2      if WinExist("Thunderbird"){          ToolTip          fnWinTray()          WinMinimize          WinClose ; Убрать если нет дополнения          Sleep, 100          ToolTip      }    }  ExitApp  fnWinTray(){    Send, {F9 Down}    KeyWait, % A_ThisHotkey    Send, {F9 Up}  return  }

 

Скрипт свёртки в трей - ThunderbirdHideTray.ahk

Sleep, 500ToolTiploop 10  {    SetTitleMatchMode, 2    if WinExist("Thunderbird"){		ToolTip		fnWinTray()		WinMinimize		WinClose		Sleep, 100		ToolTip	}}		returnfnWinTray(){	Send, {F9 Down}	KeyWait, % A_ThisHotkey	Send, {F9 Up}return }

 

 

Скрипт кнопки на JS

/*Initialization Code*/this.tooltipText = "Left       ―   Свернуть Mozilla Thunderbird\n" +"DLeft    ―    Выйти из Mozilla Thunderbird\n" +"Right    ―    Перезагрузить Mozilla Thunderbird";this.leftclick = function(event) {	startProcess("C:\\Program Files (x86)\\Mozilla Thunderbird\\ThunderbirdHideTray.exe",[""]);   };this.leftDclick = function(event) { goQuitApplication();};this.rightclick = function(event) {  if(!event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {	event.preventDefault();        event.stopPropagation();  	var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]                             .getService(Components.interfaces.nsIAppStartup);  	appStartup.quit(appStartup.eForceQuit | appStartup.eRestart);  	}};function startProcess(path, args) {    var file = Components.classes["@mozilla.org/file/local;1"]        .createInstance(Components.interfaces.nsILocalFile);     file.initWithPath(path);    if(file.exists()) {       var process = Components.classes["@mozilla.org/process/util;1"]              .createInstance(Components.interfaces.nsIProcess);       process.init(file);        process.run(false, args, args.length);      } else custombuttons. alertBox ("Файл не найден", path); };this.setAttribute('onclick', 'custombuttons.gQuot.mHandler(event, this)');this.setAttribute('ondblclick', 'custombuttons.gQuot.mHandler(event, this)');

 


 

 

Дальше всё просто.

  1. Компилируем ThunderbirdHideTray.ahk в ThunderbirdHideTray.exe и кидаем её в C:\Program Files (x86)\Mozilla Thunderbird\  она работает с кнопкой на JS, но об этом в другой теме - Готовые кнопки для продуктов Mozilla(см. мою подпись)
  2. Компилируем ThunderbirdStartHide.ahk в ThunderbirdStartHide.exe и кидаем её в... куда угодно

Дальше занимаемся :smiles: т.е. правим автозапуск, ведь ради этого мы и страдали фигнёй.

Запомните!!!

Eсли ранее в автозапуске было C:\Program Files (x86)\Mozilla Thunderbird\Thunderbird.exe, то теперь, как пример C:\Program Files (x86)\Mozilla Thunderbird\ThunderbirdStartHide.exe

 

Вариант №1 На ваш выбор

Вариант №2 Реестр используя regedit

Вариант №3 Мой выбор :grin: программа AnVir Task Manager - она бесплатная.

6.png

 

 

Бонус — тут есть всё, даже с избытком   Thunderbird Code and Script.zip

 

Удачи, ну и т.д.

post-37016-0-41923000-1433192170_thumb.p

Thunderbird Code and Script.zip

Изменено пользователем Форматцевт
Ссылка на комментарий
Поделиться на другие сайты

Суммарный скрипт для Ведьмак® 3 - Дикая Охота

  • Закрывает не нужные приложения перед запуском игры.
  • Запускает сам игру.
  • Контролирует(блокирует) повторный запуск игры.
  • Авто-завершение скрипта по таймеру, если игра выгружена, т.е. завершена.
  • Реализует функцию - Три клавиши в одной клавише(как бонус или как пример).

По сути всё не сложно, это суммирование скриптов описанных выше, но всё же описать нужно,так как всё простое бывает сложно в совокупности.
 
 

И так, основной блок, который содержит кое какие нужные изменения/правки.

Да, изменения есть, но что делать, игра стала немножко другая, более технологичная и сложнее в области перехвата.

 



;-----Инициализация;Скрипт не выгружается до явного определения#Persistent;Всегда производим повторный запуск без запроса#SingleInstance  ForceOnExit, lEnd_Witcher3#Include C:\AHK\Include\                  ; Устанавливаем путь к файлам скрипта#Include CloseNetWorkApps.ahk             ; Закрытие мешающих сетевых приложений командой taskkill /F /IM NAME.exe#Include RunCon.ahk                       ; Запуск с консолиSetTimer, lCheckWorkScript, Off ; таймер проверки игры и если игра выгружена то скрипт сделает автовыход.сTimeChkGame := 15000 ; Раз в 15 секунд будет проверятся существование игры; Меню в трее будет не стандартным, а своим - его можно дополнять    fnTray() ; Проверка повторного запуска приложения, время ожидания 5 секунд  If (fnCheckRestartWaitProc("witcher3.exe",5))        {          SetTimer, lCheckWorkScript, %сTimeChkGame%          Return  ; Выходим, а скрипт отстаётся работать        }        ; Производим закрытие не нужных приложений нагружающих ЦП и ОЗУ    arNetApps :=  [["taskkill /F /IM pidgin.exe",""]                ,["taskkill /F /IM uTorrent.exe",""]                ,["taskkill /F /IM thunderbird.exe",""]                ,["taskkill /F /IM Skype.exe",""]                ,["",""]]  fnCloseNetWorkApps(2,arNetApps*) ; Запускаем приложение, в данном случаее это Ведьмак® 3 - Дикая ОхотаThread, NoTimers  ExcutePath := "F:\GameS\The Witcher 3 Wild Hunt\bin\x64\witcher3.exe"  WorkPath   := "F:\GameS\The Witcher 3 Wild Hunt\bin\x64\"  Run, %ExcutePath%, %WorkPath%Thread, NoTimers, false  Sleep 1000  SetTimer, lCheckWorkScript, %сTimeChkGame%Return ; Выходим, а скрипт отстаётся работатьlCheckWorkScript:  If (fnCheckRestartWaitProc("witcher3.exe",2))        Return ; игра активна  Gosub lEnd_Witcher3 ; Игры нет, надо завершить скриптReturnlEnd_Witcher3:ExitApp ; Условия выхода реализованно через меню трея и через таймерfnTray(){global ;Установки трея для скрипта    Menu1  := "Выход"    Menu, tray, NoStandard  ; меню в трее будет не стандартным - своим            ;Добавляем пункт меню по ПКМ      Menu, tray, add  ;Разделитель        Menu, tray, add, %Menu1%, lEnd_Witcher3      Menu, tray, add  ;Разделитель                    ; Задаём свою выноску "балон"      Menu, tray, tip, ——Обработка клавиш——`n        Ведьмак® 3 - Дикая Охота`n`nАвтор: Indomito©`nReturn};------Функция проверки повторного входа(игра уже запущена или нет, скрипт не проверяем)fnCheckRestartWaitProc(vPIDName, vWaitProc){  Thread, NoTimers    Process, Wait, %vPIDName% , %vWaitProc% ; Ждем процесса  vPIDName,  vWaitProc секунд    if (ErrorLevel == 0)          vRet  := False  ; Программа и/или скрипт не запущен    Else          vRet  := True        Thread, NoTimers, false  Return vRet ; Выходим с ответом};-------------------------------------------------------------------------------------SetTitleMatchMode, 1    ; Окно должено начинаться со слов "The Witcher"#If WinActive("The Witcher")  ; Тут можно переназначать клавиши, запускать таймеры и т.д.; Только делать это надо аккуратно, а то "концов не найдёте" ;)



 
Вот по сути и всё, в аттаче только исходный текст скрипта.

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

  • скрипт должен быть откомпилирован в ЕХЕ-файл иначе он не будет работать из за запуска стороннего приложения
  • корректирующие таймеры отсутствуют, что бы не путать вас, кроме таймера авто-завершения скрипта
  • меню в трее построено так, что может быть изменено - об этом писал в более ранних постах
  • файлы подключаемые по #Include  - CloseNetWorkApps.ahk и RunCon.ahk описаны выше в постах и не подвергались модификации.
  • файлы подключаемые по #Include нужны только для функции fnCloseNetWorkApps - т.е. без них можно обойтись, удалив соответствующие строки подключения, описания и вызова функции
  • файлы должны быть в формате UTF-8
  • компилировать используя библиотеки - Unicode 32-bit или Unicode 64-bit, использовать MPRESS необязательно(по желанию)
  • версия АНК и компилятора  — 1.1.22.2 ЭТО ОБЯЗАТЕЛЬНО!!!

Аттач: Файл RunKeysWitcher3.ahk в ZIP-архиве(UTF-8)  — RunKeysWitcher3.zip

RunKeysWitcher3.zip

Изменено пользователем Форматцевт
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Скрипт/код для Чтения и диагностики файла любой сложности

  • Читает INI-файл, в любых вариантах и любой сложности.
  • Выдаёт диагностику.
  • Позволяет настроить систему диагностики.
  • Реализован как две независимые функции(из вне).
  • Возвращает считанное значение в указанную перемеренную, а так же возвращает доп. значения для точной идентификации считанного.

Все коды будут под спойлером иначе, пост займёт не одну страницу

 

И так, не всё так сложно как я написал, начну с простого, с диагностики ошибок.

 

Сначала нам потребуется фрагмент определения поведения встроенной функции MsgBox

;Тут только OK  сMsgBoxInfo_Ok          :=0+8192+64 ;only an OK button + Task Modal + Icon Asterisk(info)  сMsgBoxError_Ok         :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)    сMsgBoxChoice_Ok        :=0+8192+48 ;only an OK button + Task Modal + Icon Exclamation;Тут Yes/No(Да/Нет)   сMsgBoxQuest_YN         :=4+8192+32 ;Yes/No button  + Task Modal + Icon Question  сMsgBoxInfo_YN          :=4+8192+64 ;Yes/No button + Task Modal +  Icon Asterisk (info);Тут OK/Cansel(Да/Отмена)  сMsgBoxInfo_OK_Cansel   :=1+8192+64 ;OK/Cansel button + Task Modal +  Icon Asterisk (info)  сMsgBoxChoice_OK_Cansel :=1+8192+48 ;OK/Cansel button + Task Modal + Icon Exclamation  сMsgBoxQuest_OK_Cansel  :=1+8192+32 ;OK/Cansel button  + Task Modal + Icon Question

Далее надо провести инициализацию функции fnIniErrorOut написав:

  •  fnIniErrorOut(0)        на свой/её обработчик реакции на ошибку;
  •  fnIniErrorOut(1000)   вами написанный обработчик реакции на ошибку, число 1000 выбрано т.к. 1000-я ошибка практически невозможна. Можно поменять, чуть подправив код, на -1, но только не на True.

Адреса обработчиков хранятся в двух глобальных переменных fnIniErrorOut_LabelMin(минимизация перед выводом ошибки) и  fnIniErrorOut_LabelExit(как говорится что делать по тайм-ауту). Они не требуют пред описания функция fnIniErrorOut создаёт/определяет их сама. 

 

Действие по умолчанию, т.е. при fnIniErrorOut(0)

 

ErrorOutMin:Thread, NoTimersCritical 	;Send, {Escape}	Sleep, 600	WinMinimize, ACritical , OffThread, NoTimers, false ReturnErrorOutExit:  ExitApp

 

 

Теперь перейдём к header functions, т.е. к заголовкам функций... говоря по русски

 

Начнём с функции fnIniErrorOut тут немного проще, и да, с этими функциями гораздо проще работать проще, чем со стандартным IniRead



Функция fnIniErrorOut(NumError, ByRef FilenameINI := "", ByRef SectionINI := "",  ByRef KeyINI := "", ByRef SecWait :=   35, ByRef cMsgBoxType := 8208)

 

  • ByRef                                             - это модификатор который говорит что переменные ссылаются на одну область памяти
  • Имя_переменной := значение  - переменная по умолчанию имеет значение, т.е. значение по умолчанию
  • NumError                                       - номер ошибки               
  • FilenameINI                                   - полный или относительны путь к INI-файлу
  • SectionINI                                      - имя секции
  • KeyINI                                            - имя ключа/переменной
  • SecWait                                         - тайм-аут
  • cMsgBoxType                               - тип ошибки сMsgBoxError_Ok :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)  это в спойлере, см. выше

 

Всё конечно заполнять не нужно, достаточно кода ошибки, тайм-аута и типа ошибки, а если вызывается функция fnIniReadAndСheck то заполнять ничего не надо.



Функция fnIniReadAndСheck(ByRef OutputINI, FilenameINISectionINI := ""KeyINI := ""KeyTrFl := TrueByRef varLen := 0ByRef SkipSec := FalseByRef SkipVar := FalsevWait :=  35)

 

Я не буду повторятся, принцип тот же, только опишу что новое.

  • OutputINI  - считанное значение из INI
  • KeyTrFl     - флаг проверки, т.е. если переменной или секции нет или переменная или секция пустая то будет ошибка №2
  • varLen      - сделана, если KeyTrFl := false, значение OutputINI вернула 0, примеры ниже их много.
  • SkipSec    - пропуск секции при возникновении/без ошибки(реализовано на всякий случай)
  • SkipVar     - пропуск переменной при возникновении ошибки/без, если SkipSec := True и SkipVar := True то приоритет за SkipSec(реализовано на всякий случай)


 

Примеры 7 штук

 

Пример №1 - самое простое применение

;---------------------Обработка секции [Main] ------------------------; Не должно быть пустым это значение исрользуется в функции fnTray() ;Замена - IniRead, Creator1, %cResIni%, Main, Creator1varSectionINI := "Main"fnIniReadAndСheck(Creator1, cResIni, varSectionINI, KeyINI := "Creator1")

Пример №2

; Переменная должна быть, но она может быть пустой  fnIniReadAndСheck(NameExitTotalKeys, cResIni, varSectionINI, KeyINI := "NameExitTotalKeys", 0, varLen)  If (!varLen)        NameExitTotalKeys := ;

Пример №3 - с диагностикой если переменная не та

;Тип контрольной суммыfnIniReadAndСheck(typeHASH, cResIni, varSectionINI, KeyINI := "typeHASH")   If (!(typeHASH = "MD2" || typeHASH = "MD5" || typeHASH = "SHA" || typeHASH = "SHA256" || typeHASH = "SHA384" || typeHASH = "SHA512"))        fnIniErrorOut(4, typeHASH, varSectionINI,  KeyINI := "typeHASH", SecWait :=  25)

Пример №4 - с диагностикой, на основе длины и возвращаемого значения функцией

;Установка статуса CapsLockret := fnIniReadAndСheck(StateCapsLock, cResIni, varSectionINI, KeyINI := "StateCapsLock", 0, varLen)  If (!ret && !varLen)        SetCapsLockState, Off  else If (ret = 1)      {        SetCapsLockState, On        SetCapsLockState, AlwaysOn      }    Else If (ret = 0)      {        SetCapsLockState, Off        SetCapsLockState, AlwaysOff      }  Else      fnIniErrorOut(4, cResIni, varSectionINI,  KeyINI := "StateCapsLock")

Пример №5 - с диагностикой и проверкой типа переменной

;--------------------Обработка секции [AllOfProcess] ---------------------varSectionINI := "AllOfProcess"  fnIniReadAndСheck(WaitProcGame, cResIni, varSectionINI, KeyINI := "WaitProcGame")  if WaitProcGame is not integer            fnIniErrorOut(6, cResIni, varSectionINI,  KeyINI := "WaitProcGame")       If (WaitProcGame < 2 )          fnIniErrorOut(8, cResIni, varSectionINI,  KeyINI := "WaitProcGame")

Пример №6 - с диагностикой и проверкой типа переменной двух типов и конвертацией

 ;----------------------------Обработка секции [Timers] -----------------------------------------varSectionINI := "Timers"  fnIniReadAndСheck(TimerСheckGameExit, cResIni, varSectionINI, KeyINI := "TimerGameExit")  if TimerСheckGameExit is not integer      {        if TimerСheckGameExit is not float              fnIniErrorOut(13, cResIni, varSectionINI,  KeyINI := "TimerGameExit")      }  TimerСheckGameExit  :=   TimerСheckGameExit * 1000  TimerСheckGameExit := Round(TimerСheckGameExit,0)  If ((TimerСheckGameExit < 10000) || (TimerСheckGameExit > 60000))            fnIniErrorOut(10, cResIni, varSectionINI,  KeyINI := "TimerGameExit")

Пример №7 - чтение секции целиком с настройкой функции fnIniErrorOut

fnIniErrorOut_LabelMin := "lMin"fnIniErrorOut_LabelExit := "lExit"fnIniErrorOut(1000)FilenameINI := "c:\AHK\AHK addon EXE\KeysExtSkyrim.res\Bats.ini\sample.ini"fnIniReadAndСheck(OutputINI, FilenameINI, SectionINI := "Bats",,0,varLen)If (!varLen)      MsgBox Пустая секцияMsgBox %OutputINI%ReturnlMin:  MsgBox МинимизацияReturnlExit:  MsgBox Конец сообщенияReturn

Хочу добавить, что не обязательно писать fnIniReadAndСheck(OutputINI, FilenameINI, SectionINI := "Bats",,0,varLen), можно и так fnIniReadAndСheck(OutputINI, FilenameINI,  "Bats",,0,varLen) просто я так привык записывать любой вызов функции с параметрами по умолчанию

 

Ну и исходник целиком - правьте как угодно, может у вас получится лучше чем у меня. 

;---------------------------Чтение и проверка INI-файла--------------------------------------------fnIniReadAndСheck(ByRef OutputINI, FilenameINI, SectionINI := "", KeyINI := ""                  , KeyTrFl := True, ByRef varLen := 0                  , ByRef SkipSec := False,  ByRef SkipVar := False, vWait :=  35){  if FileExist(FilenameINI)        {          IniRead, OutputINI, %FilenameINI%, % SectionINI, % KeyINI          varLen  :=  StrLen(OutputINI)        }         Else        {          NumError := 1          fnIniErrorOut(NumError, FilenameINI, SectionINI,  KeyINI, vWait) ; нет файла          Return        }    ; Просто пропуск Секции/Переменной - ошибка игнорируется  If (SkipSec || SkipVar)        {          If (SkipSec) ; У секции более высокий приоритет, если SkipSec = SkipVar = True                OutputINI := SectionINI            Else If (SkipSec)                OutputINI := SectionINI                          Return True         }    if ((OutputINI) && (OutputINI != "ERROR"))            Return True ; переменная есть           If (!OutputINI)        {          If (varLen = 0)              {                If (KeyTrFl)                    {                      NumError := 3                      fnIniErrorOut(NumError, FilenameINI, SectionINI,  KeyINI, vWait) ; Пустые переменные не допустимы                      Return                                                                  }                  Else                    Return False ; Пустая переменная, не может быть это 0(varLen = 0)              }            Else              Return False  ; Не пустая переменная(varLen != 0) может быть равна 0        }    ; Пропуск Секции/Переменной при ошибке  If ((OutputINI = "ERROR") && (SkipSec || SkipVar)) ; У секции более высокий приоритет, если SkipSec = SkipVar = True        {          If (SkipSec)                OutputINI := SectionINI            Else If (SkipSec) (SkipSec)                OutputINI := SectionINI                          Return False         }           ; Пропуск Переменной в Секции при ошибке  If ((OutputINI = "ERROR") && SkipVar)        {          OutputINI := SectionINI          Return False         }           If (OutputINI = "ERROR") ; Ошибка отсутствует Секция и/или Переменная        {                    NumError := 2          fnIniErrorOut(NumError := 2, FilenameINI, SectionINI,  KeyINI, vWait) ; не верная переменная или секция          Return        }};--------------------------------------------------------------------------------------------;--------------------Диагностика об ошибках в INI (fnIniReadAndСheck)------------------------fnIniErrorOut(NumError, ByRef FilenameINI := "", ByRef SectionINI := "",  ByRef KeyINI := "", SecWait :=  35, ByRef cMsgBoxType := 8208){Global fnIniErrorOut_LabelMin, fnIniErrorOut_LabelExit  If (NumError = 0)        {          fnIniErrorOut_LabelMin  := "ErrorOutMin"          fnIniErrorOut_LabelExit := "ErrorOutExit"          ;MsgBox На внутренние обработчики т.к. NumError = 0          Return        }  Else If (NumError = 1000)            {              ;MsgBox На внешние обработчики т.к. NumError = 1000              Return            }; cMsgBoxType по умолчанию равна AllMainConst.ahk; сMsgBoxError_Ok         :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)  arIniErrorTXT :=  [" Отсутствует INI-файл"                                        ; = 1                    ," В имени переменной/её нет/ошибка в имени секции."            ; = 2                    ," Переменная не может быть пустой."                            ; = 3                    ," Переменная содержит недопустимое значение."                  ; = 4                    ," Переменная должна быть числом."                              ; = 5                    ," Переменная должна быть целым числом."                        ; = 6                    ," Переменная должна быть числом с плавающей точкой."           ; = 7                    ," Переменная меньше допустимого значения и не число."          ; = 8                    ," Переменная больше допустимого значения и не число."          ; = 9                    ," Переменная  вне допустимого диапазона или не число."         ; = 10                    ," Переменная содержит не верный путь и/или программу."         ; = 11                    ," Переменная содержит не верный путь."                         ; = 12                    ," Переменная не число, ни целое/ни с плавающей точкой."        ; = 13                    ," Резерв или ошибка в программе."                              ; = 14                    ," Резерв или ошибка в программе."                              ; = 15                    ," Резерв или ошибка в программе."                              ; = 16                    ," Резерв или ошибка в программе."                              ; = 17                    ," Резерв или ошибка в программе."                              ; = 18                    ," Резерв или ошибка в программе."                              ; = 19                    ," Резерв или ошибка в программе."                              ; = 20                    ," Резерв или ошибка в программе."                              ; = 21                    ," Резерв или ошибка в программе."]                             ; = 22  Error_TXT :=  arIniErrorTXT[NumError]  cWait :=  SecWait  Gosub %fnIniErrorOut_LabelMin%    cTitle      :=  "`n`n Ошибка в INI-файле" ;Титул MsgBox    cMsgErr     :=  "                                 ОШИБКА В INI-ФАЙЛЕ`n`n  ->>" Error_TXT    cTxtErrAd1  :=  "`n`n Файл : " FilenameINI    cTxtErrAd2  :=  "`n Секция = [" SectionINI "] `n Ключ = " KeyINI    ;cWait       :=  35    cTxtErrAd3  :=  "`n`n Выход из программы(Тайм-аут = " cWait " сек)."      MsgBox % cMsgBoxType, %cTitle%, %cMsgErr% %cTxtErrAd1% %cTxtErrAd2% %cTxtErrAd3%, %cWait%          Gosub %fnIniErrorOut_LabelExit%ReturnErrorOutMin:Thread, NoTimersCritical 	;Send, {Escape}	Sleep, 600	WinMinimize, ACritical , OffThread, NoTimers, false ReturnErrorOutExit:  ExitAppReturn};--------------------------------------------------------------------------------------------

 

Вот исходный текст обеих функций IniReadDiag.zip

 

P.S. Я наверное в этой теме не буду временно ничего публиковать - подписок, скачиваний, etc - пока нет, значит не нужно/не интересно.

IniReadDiag.zip

Изменено пользователем Форматцевт
Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

Моя жена в очередной раз подсела на линейку, т.е. на "Фэнтезийная онлайн игра Lineage 2" ну и меня собой утянула... как всегда. :mrgreen:
Игровой сайт - https://asterios.tm, адрес даю т.к. на нём разрешены скрипты на AHK... а вот почему, для меня загадка... ну и ладно.
 
Начал играть и тут же столкнулся сразу с двумя проблемами.

  • Жена не отключает µTorrent - надеюсь вы понимаете что это приводит к жутким лагам, пинг около 500 ms и выше, хотя трассировал сервер максимальный пинг 3 ms. Трассировка выполнялась ПО WinMTR.exe
  • Клиент под названием AsteriosGame.exe, а не L2.exe - висел в процессах, хотя его окно уже закрыто... приходилось закрывать в ручную.

Меня на такое измывательство хватило 2-3 дня и я написал скрипт, я не буду давать серверный вариант, т.к. там сложновато с разборкой - надеюсь простой версии хватит.
 
Комментарии в AHK почти как в С++
Блоковый - одинаков
Строчный(от и до конца строки) не //, а ;

 

Main-файл

;Скрипт не выгружается до явного определения#Persistent;Автозамена новым процессом без запроса#SingleInstance Force; Безусловная установка хука клавиатуры для NumLock CapsLock ScrollLock #InstallKeybdHook; Влючаем в непереключаемое состояние NumLock = On, до конца работы скриптаSetNumLockState, AlwaysOn;Влючаем в непереключаемое состояние CapsLock = Off, до конца работы скриптаSetCapsLockState, AlwaysOff;Влючаем в непереключаемое состояние ScrollLock = Off, до конца работы скрипта;SetScrollLockState, AlwaysOff vExitCode :=  0OnExit, lEnd_AHK_LA2Asterios;Подключаем библиотеки - не нарушайте последовательность подключения, это приведёт к ошибкам!!!!!#Include C:\AHK\Include\                  ; Устанавливаем путь к библиотекам#Include AllMainConst.ahk                 ; Константы базовые#Include IniReadDiag.ahk                  ; Работа с INI + диагностика ошибок#Include CloseNetWorkApps.ahk             ; Закрытие мешающих сетевых приложений командой taskkill /F /IM NAME.exe#Include RunCon.ahk                       ; Запуск с консоли#Include AllAddFunc.ahk                   ; Библиотека дополнительных функций  vGameKey := True  cLA2WinTitle  := "Asterios"  vDelayHold  := 50  ;Тут запустить таймер проверки игры  cRatePeriod  := 1000 ;1 секунда  cRatePeriodProcLA2 := cRatePeriod*30 ;30 секунд тайм-аут до отключения  ;vPIDName0  := "L2.exe"  vPIDName  := "AsteriosGame.exe"  vWaitProc := 2   arNetApps    := [["pidgin.exe",""],["uTorrent.exe",""],["thunderbird.exe",""],["Skype.exe",""],["",""]] ;arNetApps    := [["pidgin.exe",""],["uTorrent.exe",""],["thunderbird.exe",""],["",""]] WaitCloseApp :=  2 ret          := fnCloseWorkApps(False, WaitCloseApp,arNetApps*)  cSleepGetHP     := 50  cSleepBodyMind  := 4500   Run, c:\TLB\Games\LineageII @ Asterios.lnk  SetTimer  lTimerProcLA2, %cRatePeriodProcLA2%ReturnlEnd_AHK_LA2Asterios:    arNetApps    := [[vPIDName,""],["",""]]    WaitCloseApp :=  2    ret          := fnCloseWorkApps(False, WaitCloseApp,arNetApps*)  ExitApp  lTimerProcLA2:Thread, NoTimersCritical  SetTitleMatchMode, 1  If (WinExist(cLA2WinTitle) = False)      Goto lEnd_AHK_LA2Asterios ; Игры нет, надо завершить скриптCritical , OffThread, NoTimers, false   Return/*;-----BEGIN--Для LA2 to  SpellhowlerSetTitleMatchMode, 2#If vGameKey && WinActive(cLA2WinTitle)#UseHook, On;Ctrl+Numlock;^Numlock::;  Send, {Alt Down}{x Down};    KeyWait, % A_ThisHotkey;  Send, {Alt Up}{x Up};Return;Alt+Shift+NumpadMult!+NumpadMult::  Gosub lGetHP  Sleep 50Return;Alt+Shift+F4!+F4::;Вампир  Send, {F4 Down}    Sleep 25  Send, {F4 Up} Sleep 50Return;Alt+Shift+F1;Body to Mind!+F1::  Loop 5    {      Gosub lGetHP        Sleep %cSleepGetHP%      Gosub lBodyMind        Sleep %cSleepBodyMind%    }  Gosub lGetHPReturnlGetHP:;HP  Send, {NumpadMult Down}    Sleep 25  Send, {NumpadMult Up}ReturnlBodyMind:  ;Body to Mind  Send, {Numpad0 Down}    Sleep 25  Send, {Numpad0 Up}Return#UseHook, Off  #IfWinActive;-----END--Для LA2 to  Spellhowler  */

 

В аттаче все и сохранена структура папок для компиляции - Drive_C to AHK.zip

 

Удачи

Drive_C to AHK.zip

Изменено пользователем Форматцевт
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Закрытие/Запуск приложений.


И так меня достало выгружать, а потом запускать разное ПО и написал программку - EndGoApps.exe

 

Программа без претензий ;) она делает выгрузку или загрузку ПО.

 

Алгоритм работы с ней:

  • Размещаем файл EndGoApps.exe где желаем или где нужно
  • При первом запуске она создаёт папку  EndGoApps.res в её месте расположения.
  • Имя программы можно поменять, а вот базовую папку нельзя.

Структура папки  EndGoApps.res

EndGoApps.res      -   Папка для ресурсов

EndGoApps.res\EndGoApps.ini - INI-files всех настроек

 

     Как выглядит EndGoApps.ini у меня

[Main]//Переменные должны быть и не должны быть пустымиCreator1=Закрытие/Запуск приложений.Creator2=Автор - Indomito 2016 год//Минимальное значение 7, т.е. 7 секундWaitUser=30[start]//Запуск программ используя ярлыки из папки ...EndGoApps.res\LNK//Переменная должна быть и может быть пустойNameStart=pidgin,uTorrent,Thunderbird,Skype[Close]//Закрытие процессов//Переменная должна быть и может быть пустойNameClose=pidgin,uTorrent,thunderbird,Skype

Далее...

 

EndGoApps.res\LNK       -   Папка для стартовых линков и в ней кучка lnk-files

 

Как с папкой быть?

  1. Кидаем в неё lnk-files
  2. Описываем их в переменной NameStart
  3. Ну и не забываем описать NameClose
  4. Одна из переменных может пустой или же обе, хотя тогда не очень понятно зачем тогда вам программа.
  5. Переменные должны быть, например так NameStart= и NameClose= иначе вывод ошибки.

Есть GUI-интерфейс, хотя я думал сделать через консоль, но попросили и сваял окошко.

 

                                    14.png

 

Все ошибки отловил.

Не контролируется наличие или не верное имя lnk или процесса!!!

 

Исходник, для любителей почитать

;Скрипт не выгружается до явного определения#Persistent;Запрет повторного запуска. Диалоговое окно не выводится.#SingleInstance IgnorevExitCode :=  0OnExit, lEnd_AHK_EndGoApps;--------------------------------- Стандартная часть - НАЧАЛО ---------------------------------------------------------#Include %A_ScriptDir%\;Подключаем библиотеки - не нарушайте последовательность подключения, это приведёт к ошибкам!!!!!#Include C:\AHK\Include\                  ; Устанавливаем путь к библиотекам#Include AllMainConst.ahk                 ; Константы базовые#Include IniReadDiag.ahk                  ; Работа с INI + диагностика ошибок#Include SetWorkApps.ahk                  ; Запуск ()/Закрытие (командой taskkill /F /IM NAME.exe)#Include RunCon.ahk                       ; Запуск с консоли#Include AllAddFunc.ahk                   ; Библиотека дополнительных функцийif A_IsCompiled    {      IfNotExist, EndGoApps.res            FileCreateDir, EndGoApps.res      ; Создаём папку для ресурсов      IfNotExist, EndGoApps.res\LNK            FileCreateDir, EndGoApps.res\LNK  ; Создаём папку для стартовых линков      FileInstall, EndGoApps.res\LNK\uTorrent.lnk, EndGoApps.res\LNK\uTorrent.lnk, 0  ; NoRW - для теста            FileInstall, EndGoApps.res\EndGoApps.ini, EndGoApps.res\EndGoApps.ini, 0        ; NoRW - для теста          }   cResPath  :=  A_WorkingDir  cResIni   :=  cResPath "EndGoApps.res\EndGoApps.ini"  cResLnk   :=  cResPath "EndGoApps.res\LNK\";====================================================================    Gosub lIniCloseStart  ; Чтение INI-files  Gosub Go_GUI          ;Запуск простого GUI-диалога  Gosub Go_GUI_Wait     ; Ожидание реакции пользователя 30 секунд, переменная WaitUser из INI-files  Return;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;**********************Простой GUI-диалог**********************Go_GUI:cEndGoAppsTitle := "Запуск/Закрытие приложений"cTxtEndGoApps := "Запустить/Закрыть приложения."cWinH := 165, cWinW := 378, cWinHym := cWinH//3 - 10, cWinWxm := cWinW//42Gui, EndGo:New , -maximizebox -minimizebox +AlwaysOnTop -Border +Caption, %cEndGoAppsTitle%Gui  EndGo:+LabelEndGo_OnGui, EndGo:Font, S13 cBlue Bold, VerdanaGui, EndGo:Add, Text, w420 h240 +Left +xm%cWinWxm% +ym%cWinHym%, %cTxtEndGoApps%Gui, EndGo:Font, S10 CDefault Bold, VerdanaGui, EndGo:Add, Button, x12 y130 w110 h30 +Center, ЗапуститьGui, EndGo:Add, Button, x132 y130 w110 h30 +Center, ЗакрытьGui, EndGo:Add, Button, x252 y130 w110 h30 +Center, ОтменаGui, EndGo:Show, h%cWinH% w%cWinW% CenterReturnGo_GUI_Wait:;WaitUser:=30  ; Ожидание реакции пользователя iTime:=WaitUser while (iTime)  {    sleep 1000    iTime--  }Goto EndGoButtonОтмена;********************************************************************EndGoButtonЗапустить:Gui, DestroyiTime := 0;Запуск lStartApps:      arListStartAppsLen := arListStartApps.Length()      Loop %arListStartAppsLen%      {        ExcutePathApps  :=  cResLnk arListStartApps[A_Index] ".lnk"        Run, %ExcutePathApps%, %cResLnk%, UseErrorLevel        if(!fnDiagLastError(ExcutePathApps))              Goto  lEnd_AHK_EndGoApps      }Goto  lEnd_AHK_EndGoApps;********************************************************************EndGoButtonЗакрыть:Gui, DestroyiTime := 0;ОстановкаlStopApps:   vDelayIs     :=  2  ret          := fnCloseWorkApps(False, vDelayIs,arListStopApps*)Goto  lEnd_AHK_EndGoApps  ;********************************************************************    EndGoButtonОтмена:EndGo_OnClose:Gui, DestroyiTime := 0;====================================================================  ;lCancelApps:lEnd_AHK_EndGoApps: ExitApp;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;====================================================================  fnDiagLastError(ExcutePathApps){  If (A_LastError)        {          ;Gosub lMinWinGameKeys          Error_TXT   :=  GetErrorString(A_LastError)          cTitle      :=  "Ошибка в имени LNK-FILE" ;Титул MsgBox          cMsgErr     :=  "`n Ошибка в файле " ExcutePathApps          cTxtErrAd1  :=  "`n`n Error №" A_LastError " ― " Error_TXT          cTxtErrAd2  :=  "`n`n Описание смотрите на ""WWW.MICROSOFT.COM"" `n По строке поиска ""SYSTEM ERROR CODES"" "          cWait       :=  25          cTxtErrAd3  :=  "`n`n Выход из программы(Тайм-аут = " cWait " сек)."          MsgBox % сMsgBoxError_Ok, %cTitle%, %cMsgErr% %cTxtErrAd1% %cTxtErrAd2% %cTxtErrAd3%, %cWait%          Return False       }    Else        Return True } ;***********************************************************************************************;Запрещаем таймеры и клавиши, НАЧАТО чтение базовых настроек из основного файла INIlIniCloseStart:CriticalThread, NoTimers  fnIniErrorOut(0);---------------------Обработка секции [Main] ------------------------; Не должно быть пустым varSectionINI := "Main"fnIniReadAndСheck(Creator1, cResIni, varSectionINI, KeyINI := "Creator1")fnIniReadAndСheck(Creator2, cResIni, varSectionINI, KeyINI := "Creator2"); Не должно быть пустым и должно быть целым не меньше 7  fnIniReadAndСheck(WaitUser, cResIni, varSectionINI, KeyINI := "WaitUser")  if WaitUser is not integer            fnIniErrorOut(6, cResIni, varSectionINI,  KeyINI := "WaitUser")       If (WaitUser < 7 )          fnIniErrorOut(8, cResIni, varSectionINI,  KeyINI := "WaitUser")          ;Считывание имён ярлыков  varSectionINI := "Start"  fnIniReadAndСheck(varNameOpenApps, cResIni, varSectionINI, KeyINI := "NameStart", 0, varLen)   If (varLen = 0)        {           fNameOpen := False        }      Else       {        fNameOpen       := True        arListStartApps := []        i := 1        Loop, parse, varNameOpenApps, %cComma%          {            arListStartApps[A_Index] := A_LoopField          }      }      ;Закрытие процессов       varSectionINI := "Close"  fnIniReadAndСheck(varNameCloseApps, cResIni, varSectionINI, KeyINI := "NameClose", 0, varLen)   If (varLen = 0)        {           fNameClose := False        }      Else       {        fNameClose     := True        arListStopApps := [["",""]]        Loop, parse, varNameCloseApps, %cComma%          {            arListStopApps[A_Index,1] := A_LoopField  ".exe"            arListStopApps[A_Index,2] := ""            i := A_Index          }        i++        arListStopApps[i,1] := ""        arListStopApps[i,2] := ""      }Critical , OffThread, NoTimers, falseReturn

 

EXE - работает на всех версих Windows EndGoApps.zip

 

Удачи :)

post-37016-0-85195300-1454437294_thumb.p

EndGoApps.zip

Изменено пользователем Форматцевт
Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

Добрый день. Подскажите: как сделать чтобы клавиша "D" в сочетании с клавишей мышки "MButton" работали как Альт+MButton, а простое нажатие на "D" оставалось буквой D?

Ссылка на комментарий
Поделиться на другие сайты

или лучше подскажите как подправить скрипт "TrioKeys.ahk   —  одна клавиша три разных действия" чтобы при 3м действии - зажатии клавиши зажималась другая клавиша

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

или лучше подскажите как подправить скрипт "TrioKeys.ahk — одна клавиша три разных действия" чтобы при 3м действии - зажатии клавиши зажималась другая клавиша

 

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

Я его буду переписывать с "нуля".

 

@dm.tr.y, Если тебе нужно срочно, то я сделаю.

Как вариант просто удержание тебе видимо не годится?

Нужны все три варианта?

 

P.S. Если честно, то я хочу в Mass Effect 3 доиграть, осталось немного я 48-го уровня, а максимум 60-й. :gun_guns:

P.P.S. Cкрипт TrioKeys.ahk лучше не править - не будет работать, там завязка на однопроходную систему прерываний.

Изменено пользователем Форматцевт
Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу



×
×
  • Создать...