Ru-Board.club
← Вернуться в раздел «Программы»

» AutoHotkey

Автор: LonerDergunov
Дата сообщения: 29.04.2013 19:50

Цитата:
зато опыт приобретешь.

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


Цитата:
Не знаю, является ли это неизбежным результатом, но при включении этого скрипта клавиша Insert перестаёт работать даже и вне текстовых полей. Например перестаёт работать выделение файлов клавишей Insert в Total Commander.

Я тоже не знаю, у меня выделение работает.
Insert отключается только в том случае, если сам курсор находится над текстовым полем (вид курсора изменён со стрелочки на вертикальную черту). В Тотале может не работать выделение (при запущенном скрипте) только в случае когда включено отображение командной строки и сам курсор находится над полем ввода командной строки.
Насчёт Shift+Insert - в коде затрагивается только нажатие самого Insert, а модификатор+Insert продолжают работать штатно.
Автор: oshizelly
Дата сообщения: 29.04.2013 19:59
LonerDergunov 19:50 29-04-2013
Цитата:
В Тотале может не работать выделение (при запущенном скрипте) только в случае когда включено отображение командной строки и сам курсор находится над полем ввода командной строки.

Ну да, я так и понял, что должно именно таким образом работать. Вот только почему-то на самом деле работает по-другому.
Командная строка в Total Commander у меня вообще по дефолту спрятана, так что курсор никак не может оказаться там случайно: это сразу становится заметно. Вот только что ещё раз перепроверил.

И совпадения тоже исключены, зависимость 100%: загружаю скрипт - Insert не работает, выгружаю - опять работает, снова загружаю - опять не работает...

Может, можно TC как-то добавить в исключения для работы скрипта? На самом деле там-то он точно не нужен.
Автор: LonerDergunov
Дата сообщения: 29.04.2013 20:10
oshizelly

Цитата:
TC как-то добавить в исключения для работы скрипта?


Код: #persistent
#If (A_Cursor = "IBeam")
#IfWinNotActive, ahk_class TTOTAL_CMD
{
Insert::return
NumpadIns::return
}
Автор: creature_ws
Дата сообщения: 29.04.2013 20:33

Код: #If (A_Cursor = "IBeam")
#IfWinNotActive, ahk_class TTOTAL_CMD
Автор: oshizelly
Дата сообщения: 29.04.2013 21:23
LonerDergunov 20:10 29-04-2013
Цитата:
 TC как-то добавить в исключения для работы скрипта?

Спасибо!

creature_ws 20:33 29-04-2013
Цитата:
Код: #If (A_Cursor = "IBeam")
#IfWinNotActive, ahk_class TTOTAL_CMD  
Почему вы считаете такую конструкцию верной?


Я не знаю, правильна ли эта конструкция с теоретической точки зрения - но подтверждаю, что она работает! Как сказал основоположник, "учение Маркса истинно, потому что оно верно" "практика - вот критерий истины".
Автор: creature_ws
Дата сообщения: 29.04.2013 21:30

Цитата:
но подтверждаю, что она работает!

Учитывается последняя директива, расположенная выше — игнорируется.
Давайте «практично» пихать в код «всё, что лезет», раз интерпретатор не ругается, значит всё делаем правильно, плевать на логику.
Автор: LonerDergunov
Дата сообщения: 29.04.2013 22:57

Цитата:
Учитывается последняя директива, расположенная выше — игнорируется.

Да, уже понял: #If and #IfWin are also mutually exclusive...


Цитата:
интерпретатор не ругается

Зря. Лучше бы ругался.
И множественные варианты записи (необязательные запятые, кавычки, переменные с одним и двумя %, повторяющие друг друга команды...) - тоже зря, удобства не доставляют, зато запутывают, во всяком случае на первых порах.
В версии 2 сделан имхо правильный шаг в отношении строгости языка.


Цитата:
плевать на логику.

Логика вместе с фантазией зашли в тупик после перебора разных вариантов объединения IfWinNotActive, #IfWinNotActive, If, #If, Hotkey...
PS. Пробовал ещё. Сдаюсь. Ничего рабочего так и не смог придумать
Автор: OnMyDSeeAtAll
Дата сообщения: 30.04.2013 03:45

Код: #If, CheckUp(getStyle, WinActive("A")) And Not getStyle>>11&1
Ins::
Numpad0::
NumpadIns::Return

CheckUp(ByRef sCtrl, hWnd)
{
ControlGetFocus,
nCtrl, % "ahk_id"hWnd
ControlGet, sCtrl, Style,, % nCtrl, % "ahk_id"hWnd
ControlGet, lCnt, LineCount,, % nCtrl, % "ahk_id"hWnd
Return, lCnt
}
Автор: oshizelly
Дата сообщения: 30.04.2013 09:03
OnMyDSeeAtAll 03:45 30-04-2013
Цитата:

Код: #If, CheckUp(getStyle, WinActive[b]("A")) [/b]And Not getStyle>>11&1
Автор: aidomars
Дата сообщения: 30.04.2013 10:22

Цитата:
Для начала лучше на кошечках потренируюсь, иначе вопросами задолбаю


Цитата:
PS. Пробовал ещё. Сдаюсь. Ничего рабочего так и не смог придумать

Ну вот, а говорил "Гоп")
Все эти танцы вокруг курсора и т.п. к хорошему не приведут. Создай GUI, навесь кнопочки и функции, поверь, это не так и сложно, зато будет свое, да и опыт не помешает.
Что в итоге надо получить? Задавай вопросы, а мы ответим.
Автор: creature_ws
Дата сообщения: 30.04.2013 13:21

Цитата:
Спасибо, но AHK ругается

Замечательно, что и в 2013 году встречаются пользователи не обновлявшие autohotkey с 2009 года. Так победим
Автор: LonerDergunov
Дата сообщения: 30.04.2013 13:23
OnMyDSeeAtAll
Монументально.
% "ahk_id"hWnd - это активное окно?


Цитата:
Что в итоге надо получить? Задавай вопросы, а мы ответим.

Как правильно записать этот скрипт? Две проверки If (вид курсора и неактивное окно), и если обе проверки выполняются - тогда блокируем клавиши.
Автор: oshizelly
Дата сообщения: 30.04.2013 14:39
creature_ws 13:21 30-04-2013
Цитата:
Замечательно, что и в 2013 году встречаются пользователи не обновлявшие autohotkey с 2009 года.

Потому что при попытке обновления версии до текущей выводится страшное предупреждение, что некоторые скрипты, написанные под старую версию, могут оказаться несовместимыми с новой.
Но я понял замечание, да. Поставил сейчас псоледнюю версию, она не ругается на скриптOnMyDSeeAtAll. Всё работает, в текстовых полях клавиша Insert блокирована, а в файловых панелях Total Commander - работает.
Автор: Goolfen
Дата сообщения: 01.05.2013 19:54
Что с этим делать? Подскажите пожалуйста.

Error at line 16.
Line Text: #z::Run www.autohotkey.com
Error: Invalid hotkey.
The program will exit.
Автор: OnMyDSeeAtAll
Дата сообщения: 02.05.2013 09:44
oshizelly
Цитата:
Подозреваю, что не вручную.

Использую SciTE-Ru:



LonerDergunov
Цитата:
% "ahk_id"hWnd - это активное окно?

Это параметр функции, аргументом которого был переданный дескриптор активного окна (WinActive("A")).

Цитата:
...если обе проверки выполняются - тогда блокируем клавиши.

Код: #If, CheckUp(WinActive("A"))
Ins::
Numpad0::
NumpadIns::Return

CheckUp(hWnd)
{
WinGetClass,
className, % "ahk_id"hWnd
Return, className="TTOTAL_CMD" And A_Cursor="IBeam" ? True:False
}
Автор: Lovec
Дата сообщения: 02.05.2013 10:33
Возможно ли с помощью AHK перехватить щелчок левой кнопкой мыши по значку Компьютер в меню Пуск и вместо Проводника запустить другой процесс?
Автор: OnMyDSeeAtAll
Дата сообщения: 02.05.2013 12:04

Код: #If, CheckUp()
LButton::
TrayTip,
% A_Hour ":"A_Min "."A_Sec, % "Do something..."
Sleep, 1500
TrayTip
Return

CheckUp()
{
MouseGetPos,,,
hWnd
WinGetClass, className, % "ahk_id"hWnd
WinGet, procName, ProcessName, % "ahk_id"hWnd
Return, className="Button" And procName="Explorer.exe" ? True:False
}
Автор: Lovec
Дата сообщения: 02.05.2013 18:13
OnMyDSeeAtAll
Спасибо, пример интересный...
Но мне нужно отловить нажатия не на саму кнопку "Пуск", а внутри меню "Пуск" на кнопку "Компьютер", "Панель управления" и т.д. Может по координатам курсора что ли...
Использую Windows 7 x64.
Автор: creature_ws
Дата сообщения: 02.05.2013 19:33

Код: ; 2 — номер пункта в меню. Нумерация сверху вниз, начинается с 1.
#if WinActive("ahk_class DV2ControlHost") && LV_GetHotItemIndex("SysListView323") = 2
LButton::Run Notepad

LV_GetHotItemIndex(classNN) {
SendMessage % LVM_GETHOTITEM := 0x1000 + 61, 0, 0, %classNN%
itemIndex := ErrorLevel + 1
if !itemIndex
ControlGet itemIndex, List, Count Focused, %classNN%
return itemIndex
}
Автор: OnMyDSeeAtAll
Дата сообщения: 02.05.2013 22:03
@creature_ws
Хороший код - спасибо.
@Lovec
Извините, не понял, что нужно с разу.
Автор: LonerDergunov
Дата сообщения: 04.05.2013 19:53
OnMyDSeeAtAll
Спасибо. Команда оказалась несколько сложнее, чем мне представлялось.

А можно ли отследить в Windows7/8 штатную функцию при перетаскивании окна (с указанным классом) за заголовок к левой или правой стороне экрана? При этом окно автоматически раскрывается на половину экрана и прилипает к боку экрана. При отпускании мыши - надо выполнить некоторые действия.
Автор: oshizelly
Дата сообщения: 05.05.2013 14:38
Не могу разобраться, как перечислить несколько разных классов окон в директиве #IfWinNotActive.
Нашёл на офф-форума вот этот топик, предлагается через определение групп. Но, на первый взгляд, как-то очень уж сложно получается: определять группы, чтобы просто добавить один дополнительный класс. Нет ли более простых решений?
Пробовал просто перечислять классы через логический оператор OR, не работает.
Пробовал также ставить несколько строк с диективой #IfWinNotActive, работает только последняя из них.

Кстати, обратил внимание, что при класс окон некоторых приложений обозначается не интуитивно понятным буквенным описанием вроде TTOTAL_CMD или OperaWindowClass, а какими-то загадочными цифровыми кодами. Например, ReGet Delux обозначается ATL:00730608. В этом есть какой-то тайный смысл?
Автор: creature_ws
Дата сообщения: 05.05.2013 18:02

Цитата:
Но, на первый взгляд, как-то очень уж сложно получается

Неправда, это не сложно.


Цитата:
определять группы, чтобы просто добавить один дополнительный класс.

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


Цитата:
Нет ли более простых решений?

Объединение требуемых окон в группу — правильное решение.
Автор: oshizelly
Дата сообщения: 05.05.2013 18:27

creature_ws 18:02 05-05-2013
Цитата:
Вы так говорите, как будто определяете дополнительный класс каждые две минуты,

Ну, может и не каждые две минуты, но несколько раз в день - это реально, по крайней мере, в период отладки.


Цитата:
, или вам известен десяток скриптовых языков в которых для перечисления окон по классам в директиве IfWinNotActive используется оператор OR.

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

Но, в общем, я понял, буду разбираться с группами.
Автор: creature_ws
Дата сообщения: 05.05.2013 19:21

Цитата:
Просто вариант с использованием логических операторов казался логичным.

Вариант логичен, но «это работает не так». Команды autohotkey, «работающие с окнами», подразумевают указание в параметре, определяющем признаки окна, указание признаков одного окна. "By design" и менять что-то уже поздно.
Создание группы окон это аналог «использования оператора OR». ahk_group указывает на множество окон предварительно определённое использованием команды GroupAdd с указанием нескольких признаков одного типа.
Возможности, предоставляемые GroupAdd, шире, чем то, что можно «накодить» самому в качестве замены.

Код: #if GetActiveWindowClass() && (activeWindowClass = "TTOTAL_CMD" || activeWindowClass = "OperaWindowClass")
Space::MsgBox

GetActiveWindowClass() {
global activeWindowClass
WinGetClass activeWindowClass, A
return true
}
Автор: oshizelly
Дата сообщения: 05.05.2013 21:01
creature_ws 19:21 05-05-2013
Цитата:
Создание группы окон это аналог «использования оператора OR».
Возможности, предоставляемые GroupAdd, шире, чем то, что можно «накодить» самому в качестве замены.

Согласен, убедили. Теперь и до меня дошло, что добавление групп не так уж сложно, как мне показалось поначалу. Просто мне нужно было увидеть пару примеров, чтобы уяснить алгоритм. Лучше ведь поздно, чем никогда?
А куда по-правильному надо совать строки с определением групп: в начало скрипта или непосредственно перед директивой, использующей эту группу? Я сейчас проверил эмпирически, вроде бы работает одинаково в обоих случаях. Но как более правильно?

P.S.
Всё-таки есть какой-нибудь мистический смысл в том, что одни классы окон обозначаются словами (например, TTOTAL_CMD или OperaWindowClass), а другие - цифровыми кодами (например, ReGet Delux кодом ATL:00730608). Или это вопрос того типа, на который и сто мудрецов...
Автор: creature_ws
Дата сообщения: 05.05.2013 21:30

Цитата:
Всё-таки есть какой-нибудь мистический смысл в том, что одни классы окон обозначаются словами, а другие - цифровыми кодами


Цитата:
А почему буквы черные и все такие разные?


Представьте, что класс окна подобен фамилии. Тогда «словами» обозначаются Ивановы, Петровы, а цифрами — разнообразнейшие Мукхопадхьяй и Мгалоблишвили. Вид непривычен, суть одна.
Автор: oshizelly
Дата сообщения: 08.05.2013 12:56
Наваял с коллективной помощью уважаемых гуру вот такой архисложный скрипт:

Код: #persistent
#If (A_Cursor = "IBeam")
GroupAdd DisableInertMode, ahk_class TTOTAL_CMD
GroupAdd DisableInertMode, ahk_class ATL:00730608
#IfWinNotActive ahk_group DisableInertMode
{
Insert::return
NumpadIns::return
}
Автор: aidomars
Дата сообщения: 08.05.2013 13:51
Запиши группы в главном файле
Автор: oshizelly
Дата сообщения: 08.05.2013 14:34
aidomars 13:51 08-05-2013
Цитата:
Запиши группы в главном файле

Попробовал. Всё равно не работает. А должно?


Код: #Include, D:\My Documents\AutoHotkey - CapsLock suppress.ahk

GroupAdd DisableInertMode, ahk_class TTOTAL_CMD
GroupAdd DisableInertMode, ahk_class ATL:00730608
#Include, D:\My Documents\AutoHotkey - disable Insert key mode (ex in Total Commander and ReGet Delux).ahk

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: как добавить ивритские шрифты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.