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

» StrokesPlus - жесты мыши для Windows

Автор: Fintrum
Дата сообщения: 18.12.2015 03:22
404NF
Спасибо, но к сожалению, вариант с AHK мне не подходит, т.к. ЛКМ уже переназначена.

PREVED

Цитата:
Да, можно так сделать. Ниже рабочий вариант. Важное уточнение.

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

Цитата:
В S+ есть разные варианты нахождения окон. Можно попробовать:
По заголовку окна: acFindWindow(nil, "CCleaner")
По классу окна программы: acFindWindow("ИмяКлассаОкна", nil)
Нахождение окна(окна самого верхнего уровня) программы по имени ее процесса:
local swnd = acGetWindowFromProcessID(acGetProcessIDFromPattern("ccleaner.*"))

1) А есть ли возможность, чтобы команда acRestoreWindow только восстанавливала свернутую программу, но не "сворачивало в окно", т.е. уменьшало её размер?

2) И возможно ли на один жест повесить две зацикленные команды, выполняемые по очереди? Пример:

- первое выполнение жеста посылает acMoveWindow(nil, gsx, gsy, 0, 200)
- второе выполнение жеста посылает acMoveWindow(nil, gsx, gsy, 600, 300)
- третье выполнение жеста опять посылает acMoveWindow(nil, gsx, gsy, 0, 200)
- четвертое выполнение жеста опять посылает acMoveWindow(nil, gsx, gsy, 600, 300)
- и т.д.

3) Можно ли сделать, чтобы поиск программы по имени ее процесса, искал несколько программ подряд? Пример:

- если запущен MPC-BE, то Активируем или Разворачиваем MPC-BE
- если запущен foobar2000, то Активируем или Разворачиваем foobar2000
- если не запущено никакой из перечисленных программ, то запускаем MPC-BE
Автор: 404NF
Дата сообщения: 18.12.2015 16:08

Цитата:
Спасибо, но к сожалению, вариант с AHK мне не подходит, т.к. ЛКМ уже переназначена

А точно не подходит? То есть вы пробовали вариант с посылкой send click? Ведь nircmd делает то же самое и система клики принимает. На первый взгляд, они должны или обе давать эффект, или обе не давать эффекта.
Автор: PREVED
Дата сообщения: 19.12.2015 01:22
Fintrum

Цитата:
Спасибо большое, сам бы я до такого не додумался.


Главный недостаток этого способа в том, что дается ограниченное время на выполнение драг-н-дропа. А также есть необходимость в вызове стороннего приложения (nircmd). В принципе, в процессе я придумал лишенный этих недостатков метод реализации. Но у этого нового метода другой недостаток - для осуществления драг-н-дропа нужно нажимать левую кнопку мыши (уже в конечной точке). А затем, перед тем, как сделать любой другой жест S+, нужно будет еще раз нажать правую кнопку мыши (вручную завершить жест драг-н-дропа).





Цитата:
1) А есть ли возможность, чтобы команда acRestoreWindow только восстанавливала свернутую программу, но не "сворачивало в окно", т.е. уменьшало её размер?


Есть встроенные в S+ команды acGetWindowTop, acGetWindowBottom, acGetWindowLeft и acGetWindowRight. С их помощью, в действии(жесте) можно сделать проверку на "развернутость" окна. Сделать такое условие, что если окно развернуто (условие выполняется, если верхняя и левая координаты окна, полученные с помощью acGetWindowTop и acGetWindowLeft равны нулю, и в сумме дают ноль) - тогда делать предварительное сворачивание окна. Тогда окно(развернутое) не будет изменяться в размере.

Примерно так (на примере с Notepad):

local checkWindow1 = acGetWindowFromProcessID(acGetProcessIDFromPattern("notepad.*"))
local topWindow1 = acGetWindowTop(checkWindow1, nil, nil)+acGetWindowLeft(checkWindow1, nil, nil)
if topWindow1 < 1 then
acMinimizeWindow(checkWindow1)
acRestoreWindow(checkWindow1)
acActivateWindow(checkWindow1)
else
acRestoreWindow(checkWindow1)
acActivateWindow(checkWindow1)
end


Где checkWindow1 - переменная, содержащая идентификатор (хэндл) окна
topWindow1 - переменная, содержащая сумму верхней и левой координат окна. У развернутых в максимальный размер окон сумма начальных координат будет равна 0.



Цитата:
2) И возможно ли на один жест повесить две зацикленные команды, выполняемые по очереди? Пример:



Вот, пример трех разных действий с их последовательным переключением в цикле с помощью жеста:

1. Код действия(жеста):

if CycleVar1==0 then
--- действие №1
acMessageBox(1, 1, nil)
CycleVar1=1
elseif CycleVar1==1 then
--- действие №2
acMessageBox(2, 2, nil)
CycleVar1=2
elseif CycleVar1==2 then
--- действие №3
acMessageBox(3, 3, nil)
CycleVar1=0
end


2. В глобальном скрипте lua нужно прописать объявление новой переменной, внутри function sp_init():

CycleVar1 = 0

3. После написания жеста перезагрузить конфиг или сам S+.


Цитата:
3) Можно ли сделать, чтобы поиск программы по имени ее процесса, искал несколько программ подряд? Пример:
- если запущен MPC-BE, то Активируем или Разворачиваем MPC-BE
- если запущен foobar2000, то Активируем или Разворачиваем foobar2000
- если не запущено никакой из перечисленных программ, то запускаем MPC-BE



В примере ниже два приложения - MS Word и Notepad

local checkWindow1 = acGetWindowFromProcessID(acGetProcessIDFromPattern("winword.*"))
local checkWindow2 = acGetWindowFromProcessID(acGetProcessIDFromPattern("notepad.*"))

if checkWindow1>0 then
acRestoreWindow(checkWindow1)
acActivateWindow(checkWindow1)
end
if checkWindow2>0 then
acRestoreWindow(checkWindow2)
acActivateWindow(checkWindow2)
end


Внутрь каждого условия можно включить еще условие - например проверку "развернутости" окна, дабы исключить нежелательное восстановление окна из развернутого состояния).
Автор: Fintrum
Дата сообщения: 19.12.2015 07:21
404NF

Цитата:
А точно не подходит? То есть вы пробовали вариант с посылкой send click? Ведь nircmd делает то же самое и система клики принимает. На первый взгляд, они должны или обе давать эффект, или обе не давать эффекта.

Тогда ещё не пробовал, но да, Вы правы, и с nircmd не работает. Значит нельзя использовать функцию кнопки, если она переназначена.

PREVED

Цитата:
Главный недостаток этого способа в том, что дается ограниченное время на выполнение драг-н-дропа. А также есть необходимость в вызове стороннего приложения (nircmd).

Похоже, в моём случае, не получится использовать никакой вариант, потому что переназначена сама ЛКМ.

Цитата:
Есть встроенные в S+ команды acGetWindowTop, acGetWindowBottom, acGetWindowLeft и acGetWindowRight. С их помощью, в действии(жесте) можно сделать проверку на "развернутость" окна. Сделать такое условие, что если окно развернуто (условие выполняется, если верхняя и левая координаты окна, полученные с помощью acGetWindowTop и acGetWindowLeft равны нулю, и в сумме дают ноль) - тогда делать предварительное сворачивание окна. Тогда окно(развернутое) не будет изменяться в размере.

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

Если окно развернуто, то просто его активировать, а если нет, то разворачивать, но в свёрнутом виде он похоже не может получить координаты и понять, что окно свернуто:

Код: local checkWindow1 = acGetWindowFromProcessID(acGetProcessIDFromPattern("notepad.*"))
local topWindow1 = acGetWindowTop(checkWindow1, nil, nil)+acGetWindowLeft(checkWindow1, nil, nil)
if topWindow1 < 1 then
acActivateWindow(checkWindow1)
else
acRestoreWindow(checkWindow1)
end
Автор: OODASDV
Дата сообщения: 21.12.2015 17:50
Спасибо.
Автор: slava10779
Дата сообщения: 23.12.2015 18:38
Здравствуйте. Подскажите пожалуйста как можно реализовать переименование файла в TotalCommander по нажатию средней кнопки мыши. Имеется ввиду только действие как при нажатии пункта переименовать из меню правой кнопки в TotalCommander. При этом средняя кнопка является Stroke Button. В программе есть Lua Script function sp_middle_mouse_up(), но как и что в нем писать я не пойму. И подходит ли он вобще для данного случая.
Автор: PREVED
Дата сообщения: 24.12.2015 12:34
Fintrum

Цитата:
А здесь странная ситуация, код правильно работает с Notepad++, а вот Firefox, если он не свернут, то он сворачивается и при развороте вручную имеет окошечный вид, хотя и на весь экран.


У Firefox очень своеобразный интерфейс, который отрисовывается собственным движком браузера. Управлять окнами Firefox-а и ему подобных приложений с помощью S+ может быть затруднительно. Заголовка окна у FF, как такового, вообще нет (он конечно есть, но реализован по-своему), что сбивает S+ с толку.

Можно попробовать:

1)Искать окно FF по заголовку:
local checkWindow1 = acFindWindowByTitleRegex(".* - Mozilla Firefox.*")

2)Команды свернуть/развернуть отправлять в Firefox через user32.dll. Нужно экспериментировать.



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


Логика простая. Мы отслеживаем два состояния окна - 1)свернуто 2)скрыто(находится в поднятом состоянии но при этом загорожено другими окнами или окном). При этом, само окно может быть развернуто во весь экран, либо иметь любой другой (отличающийся от развернутого) размер. Скрипт отрабатывает вызов окна из любой комбинации этих состояний. Что логично, ведь нам нужно затребовать окно на передний план, независимо от его состояния и, желательно, не меняя исходный размер окна.
Команда acMinimizeWindow в скрипте нужна для того, чтобы развернутое (но загороженное) окно сохраняло свой размер, а именно, чтобы размер не сбивался командой acRestoreWinow при его вызове на передний план.


Цитата:
Если окно развернуто, то просто его активировать, а если нет, то разворачивать, но в свёрнутом виде он похоже не может получить координаты и понять, что окно свернуто


Для нормальной работы нужно сочетание acRestoreWindow и acActivateWindow.
Автор: slava10779
Дата сообщения: 24.12.2015 13:22

Цитата:
PREVED

А мне можешь чего подсказать по моему вопросу?
Автор: PREVED
Дата сообщения: 24.12.2015 23:34
slava10779

Цитата:
Здравствуйте. Подскажите пожалуйста как можно реализовать переименование файла в TotalCommander по нажатию средней кнопки мыши. Имеется ввиду только действие как при нажатии пункта переименовать из меню правой кнопки в TotalCommander. При этом средняя кнопка является Stroke Button.


В Global Lua, вставляем нижеприведенный код во внутрь функции function sp_after_release():

if acGetClassName(acGetOwnerWindowByPoint(acGetMouseLocationX(), acGetMouseLocationY())) == "TTOTAL_CMD" then
acMouseClick(acGetMouseLocationX(), acGetMouseLocationY(), 2, 1, 1)
acSendKeys("{F_2}")
end


(не забываем про еще один end в конце, закрывающий саму функцию function sp_after_release() )


Работает с помощью нажатия средней кнопки мыши(если средняя кнопка является кнопкой инициализирующей жесты, т.е. Stroke Button в настройках S+) в комбинации с нажатием любой другой кнопки мыши. Например Средняя кнопка(клик) + клик левой кнопкой. Другой вариант: средняя кнопка мыши + прокрутка колесом(в любую сторону). Будет работать и так и так.
Связанно это с тем, что S+ не отрабатывает в качестве жеста одиночное нажатие Stroke Button. А вот в связке с нажатием другой кнопки - пожалуйста.



Примечания:

1. Обратить внимание на имя класса окна тотал коммандера: TTOTAL_CMD. В зависимости от версии Total Commander, оно может отличаться. Я проверял на версии TC 7.50a.

2. Если в самом TC выставлена настройка "Открывать файл/папку одиночным кликом", то работать не будет. Так как скрипт имитирует нажатием левой кнопки мыши для выбора нужного для переименования файла.

3. Можно написать и отдельные жесты (с разными действиями) для TC на каждую из комбинаций средней кнопки мыши и нажатий других кнопок мыши. Например. СКМ+прокрутка колесом вниз - удалить файл. СКМ+прокрутка колесом вверх - копировать файл. И т.п. и т.д. Порядок обычный - на каждое действие свой жест с разными модификаторами.
Автор: slava10779
Дата сообщения: 24.12.2015 23:46

Цитата:
Если в самом TC выставлена настройка "Открывать файл/папку одиночным кликом", то работать не будет

Это как раз и стало причиной неудобного переименования... Обойти нельзя? Вместо нажатия левой поставить нажатие правой например. По правой файл выделяет у меня. Или нажатие средней... И как этот скрипт к модификатору привязать? В LUA Script писать что то нужно?
Автор: PREVED
Дата сообщения: 25.12.2015 14:37
slava10779

Цитата:
Это как раз и стало причиной неудобного переименования... Обойти нельзя? Вместо нажатия левой поставить нажатие правой например. По правой файл выделяет у меня. Или


Если выделение файла в TC настроено по правой кнопке, тогда заменить в скрипте строчку:
acMouseClick(acGetMouseLocationX(), acGetMouseLocationY(), 2, 1, 1)

на две строчки

acMouseClick(acGetMouseLocationX(), acGetMouseLocationY(), 0, 1, 1)
acMouseClick(acGetMouseLocationX(), acGetMouseLocationY(), 0, 1, 1)


Будет работать с учетом упомянутых настроек TC. Правая кнопка - выделение. Открытие и запуск файлов одиночным кликом левой кнопки.




Цитата:
И как этот скрипт к модификатору привязать? В LUA Script писать что то нужно?


Создать новый жест, только не глобальный, а для приложения Total Commander (со свойствами окна Total Commander) и отметить в нем модификатор, например "Scroll Down" (колесо вниз).
Тогда и код в Global Lua не нужен. А код (в жесте) будет выглядеть проще. Например:

acMouseClick(acGetMouseLocationX(), acGetMouseLocationY(), 0, 1, 1)
acSendKeys("{F_2}")

(делает переименование файла, с помощью имитации нажатия клавиатурной клавиши F2, предварительно кликнув по файлу правой кнопкой мыши)
Автор: silealio
Дата сообщения: 25.12.2015 14:45
Подскажите жест, чтобы упершись в один из углов экрана изменять только колесом мышки системную громкость громче\тише...
Автор: slava10779
Дата сообщения: 25.12.2015 19:40
PREVED,
Все работает, спасибо! Изменил под свою горячую клавишу, продублировал строку acMouseClick(acGetMouseLocationX(), acGetMouseLocationY(), 0, 1, 1) еще раз, чтобы снимало выделение красным и все ок. Но пришлось между дублями задержку вставить, не успевало второй клик обрабатывать.
Автор: PREVED
Дата сообщения: 27.12.2015 00:05
silealio

Цитата:
Подскажите жест, чтобы упершись в один из углов экрана изменять только колесом мышки системную громкость громче\тише...


Немного доработал свой старый жест. Делюсь.

- Зажимать кнопку мыши (на выбор - какую настроить) перед вращением колеса все-таки придется (иначе как S+ поймет что вообще выполняется жест?). Например: зажимаем правую кнопку мыши и крутим колесо. Зажимаем естественно ту кнопку, которая указана в настройках S+ в качестве "Stroke Button".
- Жест срабатывает в левом верхнем углу экрана
- При изменении уровня громкости на экране отображается текущий уровень в виде цифры а также всплывает стандартный звуковой ползунок Windows (и то другое скрывается автоматически при отпускании кнопки)
- Уровень меняется с шагом в 10% от макс. громкости
- Если жест выполняется за пределами верхнего левого угла экрана, то ему можно задать совсем другое действие (например - переключение между открытыми окнами программ), смотря какой код туда вставите.



1. Создаем глобальный жест (Global Action - Add Action)
Название: Volume-
Модификаторы (Mouse / Key Modifiers): Scroll Down

Код:

if acGetMouseLocationX()<50 and acGetMouseLocationY()<50 then
    sndVolRun=1
    acKillDisplayText()
        if acGetProcessIDFromPattern("sndvol.*") == 0 then
     acRunProgram("C:\\Windows\\system32\\sndvol.exe","-f",0,1)
        end
    acSetVolume(acGetVolume()-10, 0)
    acDisplayText(acGetVolume().. " VOL-", "Arial", 130, 0, 200, 50, 1000, 500, 400)
else
--- здесь задаем действия, которые будут делаться если курсор мыши в любой другой области экрана
--- acDisplayText(acGetVolume().. "TEST", "Arial", 76, 0, 0, 0, 1000, 500, 400)
end



2. Создаем глобальный жест (Global Action - Add Action)
Название: Volume+
Модификаторы (Mouse / Key Modifiers): Scroll Up

Код:

if acGetMouseLocationX()<50 and acGetMouseLocationY()<50 then
    sndVolRun=1
    acKillDisplayText()
        if acGetProcessIDFromPattern("sndvol.*") == 0 then
     acRunProgram("C:\\Windows\\system32\\sndvol.exe","-f",0,1)
        end
    acSetVolume(acGetVolume()+10, 0)
    acDisplayText(acGetVolume().. " VOL+", "Arial", 130, 0, 200, 50, 1000, 500, 400)
else
--- здесь задаем действия, которые будут делаться если курсор мыши в любой другой области экрана
--- acDisplayText(acGetVolume().. "TEST", "Arial", 76, 0, 0, 0, 1000, 500, 400)
end



3. На вкладке Global Lua, во внутрь функции function sp_after_release() вставляем код:

if sndVolRun==1 then
    acKillDisplayText()
    acActivateWindow(acFindWindow(msctls_trackbar321, nil),0,0)
end



4. На вкладке Preferences убеждаемся в том, что включены следующие опции:
- Fire Recognition on Mouse Wheel Scroll
- Allow After Release Script

и выключено:
- Only Capture on Defined Applications


Автор: silealio
Дата сообщения: 27.12.2015 01:46
PREVED
Ого, спасибо за труды\потраченное время, сделал по инструкции, всё фунциклирует. Дальше отполирую ещё, чтобы вкладки переключать на активном окне...
Автор: silealio
Дата сообщения: 27.12.2015 17:50
Можно ли по мотивам вот этого поста: http://forum.ru-board.com/topic.cgi?forum=5&topic=45983&start=60#4
- жестом вызывать на экране меню с вариантами поиска, и после выбора пункта меню - происходил поиск?
Автор: 404NF
Дата сообщения: 28.12.2015 00:11
silealio
Можно, начиная с версии 2.7.5 Как - описано здесь http://www.strokesplus.com/forum/topic/793/added-accreatepopupmenu Проблема в том, что таким способом удастся задействовать далеко не всякую поисковую систему. Именно поэтому я хотя и пользуюсь подобным меню для большинства приложений (написанном, правда на АНК а не Lua), в фоксе остаюсь верным старому доброму SlectionSK.
Хотя это ограничение, вероятно, можно обойти, если какое-то фоксовское дополнение позволяет назначить горячие клавиши на вызов меню поисковых систем - тогда достаточно назначить для одного и того же жеста в Firefox эмуляцию нажатия этих клавиш а в других программах - сразу запускать пользовательское меню S+.
Автор: silealio
Дата сообщения: 31.12.2015 07:00
Бороздя просторы форума, наткнулся на мегаважный хинт от разработчика: http://www.strokesplus.com/forum/topic/1109/guide-keystrokes-and-timing
Отныне, никаких acSendKeys("^n"), да будет acSendKeys("^{DELAY 20}n")!

404NF
-спасибо, то, что надо. Возможности этой проги пожалуй безграничны, уже появилась куча идей для реализации...
Автор: 404NF
Дата сообщения: 31.12.2015 09:23

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

Не сказал бы. Это возможности Lua очень широки, но для меня этот язык сложноват - Autohotkey для операций с клавиатурой, мышью, манипуляций окнами и создания пользовательских меню достаточен и в использовании не в пример проще. А вот S+ далеко не всесилен. С действиями по жесту мыши она справляется отлично, лучшая в своем классе, но когда ее пытаются использовать для чего-то другого, то приходится громоздить костыли на костыли. Скажем, хотел я копировать фрагмент текста мышкой если зажать и не отпускать левую клавишу в течении какого-то времени. Роб мне ответил: It *may* be possible, but I feel like it wouldn't work out as smoothly as a dedicated utility. Like I said, it may be possible, but in the current form and function of S+, I feel it would likely be problematic at best.
Возможно, ему просто не хотелось вникать, но на АНК я такую штук сделал, там кода три десятка строк - что называется "на коленке".
Но, повторюсь, для операций с жестами мыши ничего удобнее нет.
Автор: Fintrum
Дата сообщения: 31.12.2015 19:02
PREVED

Цитата:
У Firefox очень своеобразный интерфейс, который отрисовывается собственным движком браузера. Управлять окнами Firefox-а и ему подобных приложений с помощью S+ может быть затруднительно.

Да, похоже здесь нет хорошего решения, ну да ладно.


Я вот, благодаря Вам, разделил экран горизонтально на две части, а есть ли способ, разделить на 4 квадратные области?

Код: if acGetMouseLocationX() <= 960
and acGetMouseLocationY() <= 1080
then
acSendKeys("a")
else
acSendKeys("b")
end
Автор: silealio
Дата сообщения: 31.12.2015 19:11
Fintrum
Цитата:
а есть ли способ, разделить на 4 квадратные области?

Вот здесь есть продвинутый пример деления или экрана или активного окна на нужное\заданное количество областей\секторов:
http://www.strokesplus.com/forum/topic/496/dyk-running-different-scripts-by-a-single-gesture

upd.
Оказалось, что после строчки:
sector=math.ceil(gsx/(x_res/h_sectors))+(h_sectors*(math.floor(gsy/(y_res/v_sectors))))

надо добавить ещё корректировку:
if gsx == 0 then -- если мышка упёрта в левый край - получается неправильный сектор при расчёте с нулём
sector = sector + 1
end    
Автор: Fintrum
Дата сообщения: 31.12.2015 19:45
silealio
Спасибо большое, попробую разобраться.
Автор: silealio
Дата сообщения: 01.01.2016 09:45
По мотивам темы: http://www.strokesplus.com/forum/topic/529/backup-your-config
глобальный скрипт для автоматических резервных копий StrokesPlus.xml и StrokesPlus.lua при каждом запуске S+


Код:     
if acGetNumber()==0 then
acSetNumber(1)

io.input(io.open("StrokesPlus.xml","r"))
local Data=io.read("*all")
local File="E:\\StrokesPlus.xml"..os.date(" %d-%m-%Y %H;%M;%S")
io.output(io.open(File,"w"))
io.write(Data)
io.close()

io.input(io.open("StrokesPlus.lua","r"))
local Data=io.read("*all")
local File="E:\\StrokesPlus.lua"..os.date(" %d-%m-%Y %H;%M;%S")
io.output(io.open(File,"w"))
io.write(Data)
io.close()

end
Автор: shadow_member
Дата сообщения: 07.02.2016 07:50
Firefox сворачивается в трей из из трея горячими клавишами Alt + w, или жестом
----------------------
-- Этот жест свернет Firefox в трей или развернет из трея
acSendKeys("%w")
----------------------
По клавишам все хорошо, а для разворачивания из трея жестом иногда приходится выполнять его дважды, т.к. при первом жесте не перехватывается фокус.
Можно ли это поправить?
Автор: PREVED
Дата сообщения: 08.02.2016 23:57
shadow_member

Цитата:
По клавишам все хорошо, а для разворачивания из трея жестом иногда приходится выполнять его дважды, т.к. при первом жесте не перехватывается фокус.
Можно ли это поправить?


Правильно ли я понял суть проблемы - при разворачивании Firefox из трея (жестом s+, с помощью имитации Alt+W) окно Firefox не всегда становится активным? Т.е. иными словами, оно всплывает, но далеко не всегда активируется?

Можно попробовать сделать принудительную активацию окна Firefox после имитации нажатия Alt+W. Мой Firefox пока такой вещи не обучен, так что прошу протестировать. Скрипт:


--- добавляем после acSendKeys("%w")
acDelay(500)
local hwndFirefox = acFindWindowByTitleRegex(".* - Mozilla Firefox.*")
acActivateWindow(hwndFirefox,0,0)
acDelay(500)
local tx = acGetWindowRight(hwndFirefox, gsx, gsy)
local tcy = acGetWindowBottom(hwndFirefox, gsx, gsy)
acMouseClick(tx-25, tcy-5, 2, 1, 1)
--- acMouseMove(gex, gey)



- Я заметил, что одной только активации окна с помощью acActivateWindow(встроенной команды в S+) для Firefox недостаточно. Окно становится активным, но не работают горячие клавиши браузера (наподобие Ctrl+T). Это удалось обойти, имитацией левого клика мыши по окну FF - в ту область интерфейса браузера, где нет кнопок, ссылок, скроллбаров и т.п. элементов его интерфейса (дабы исключить нежелательные срабатывания).

- Команда acMouseMove(gex, gey) в конце скрипта закомментирована. Она призвана возвращать курсор мыши в координату, на которой закончилось выполнение жеста (после его срабатывания). Но почему-то надежно срабатывает только в случае если окно Firefox развернуто на весь экран. Если же Firefox находится в уменьшенном оконном режиме (т.е. когда окно браузера НЕ развернуто на весь экран), фокус с его окна при перемещении курсора(команда acMouseMove) почему-то сбивается и окно FF сворачивается. Хотя, казалось бы, acMouseMove - это просто перемещение курсора и ничего более. Возможно баг S+? Просьба проверить.

- В строке acMouseClick(tx-25, tcy-5, 2, 1, 1) выражение tx-25 и tcy-5 означают координату, куда будет производится клик в окне Firefox. Я использовал в этом качестве крайний правый нижний угол окна браузера, чуть левее вертикального скроллбара. Скорее всего, под разными экранными разрешениями, эти величины могут меняться (нужно иметь ввиду, при подгонке жеста конкретно под свою систему).



Автор: shadow_member
Дата сообщения: 10.02.2016 18:56
PREVED
Дошли руки проверить. Не работает, выглядит так- окно FF сворачивается, и тут же разворачивается, как будто последовательно выполняются два жеста. Снимал комментарий с последней строки, результат тот же. Да, горячие клавиши на свернуть/развернуть одни и те же, Alt + w.
Добавлено:
Цитата:
Правильно ли я понял суть проблемы - при разворачивании Firefox из трея (жестом s+, с помощью имитации Alt+W) окно Firefox не всегда становится активным? Т.е. иными словами, оно всплывает, но далеко не всегда активируется?
Нет, не так. FF свернут в трей, на первый жест просто не реагирует, после второго жеста разворачивается из трея. Так бывает не всегда, но есть на двух машинах, закономерности не уловил, но, кажется, такое бывает, если FF свернут в трей, а пользователь после работы в других приложениях пытается жестом его развернуть.
Автор: PREVED
Дата сообщения: 11.02.2016 20:02
shadow_member

Цитата:
Дошли руки проверить. Не работает, выглядит так- окно FF сворачивается, и тут же разворачивается, как будто последовательно выполняются два жеста. Снимал комментарий с последней строки, результат тот же. Да, горячие клавиши на свернуть/развернуть одни и те же, Alt + w.


Да, явно не доработано (даже под задачу, которую я понял по-своему). Нужно вычислять состояние окна FF - в трее оно или свернуто. Я правда тестировал сворачиваемость FF в трей с помощью Actual Window Manager (есть там такая функция - скрыть любое окно в трей).


Цитата:
Нет, не так. FF свернут в трей, на первый жест просто не реагирует, после второго жеста разворачивается из трея. Так бывает не всегда, но есть на двух машинах, закономерности не уловил, но, кажется, такое бывает, если FF свернут в трей, а пользователь после работы в других приложениях пытается жестом его развернуть.


А жест точно всегда выполняется при разворачивании? Ведь прежде чем сработать, жест должен быть правильно выполнен и интерпретирован S+.
Можно вставить в код жеста нижеприведенную строку, чтобы понять, всегда ли жест выполняется или нет:
acDisplayText("TEST", "Arial", 76, 0, 0, 0, 2000, 500, 400)

Если фраза "TEST" вылезет на экран, жест можно считать исполненным.


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

- Активировать родительское окно под курсором мыши (подразумевается, что это может быть окно Firefox)

- Получить класс активного окна (подразумевается, что это может быть окно Firefox)

- Если класс окна равен "MozillaWindowClass" -> имитировать нажатие Alt+W (т.е. свернуть Firefox в трей) -> Прекратить выполнение жеста

- Если класс окна НЕ равен "MozillaWindowClass" -> имитировать нажатие Alt+W -> подождать -> получить класс у активного окна (подразумевается, что окно Firefox после его успешного восстановления из трея становится активным) -> Проверить класс у активного окна (еще раз)
- Если класс у окна равен "MozillaWindowClass" -> прекратить выполнение жеста.
- В противном случае снова имитировать Alt+W и запустить (после задержки) проверку класса у активного окна. Выполнять это действие пока класс у активного окна не станет равным "MozillaWindowClass"



p.s. Не могу проверить т.к. мой Firefox не обучен свертыванию в трей. Полагаю, что здесь нужно что-то типа отдельного расширения и сконфирурированного keyconfig.
Автор: shadow_member
Дата сообщения: 11.02.2016 20:10
PREVED
ОК, буду пробовать. FF в трей по горячим клавишам- расширение TrayHotKey.
Автор: Edmanz
Дата сообщения: 16.02.2016 03:22
Проблема с жестами в CADовском ПО (в трех разных прогах одинаково). Ссылка на видео в конце поста.

При масштабировании винды с отключенной XP-совместимостью, жесты "отскакивают" на дистанцию от курсора и срабатывают крайне редко.
Программы эти не DPI-aware, насколько я понял. Тоесть масштабируются плохо, с замыливанием шрифтов. Но и жесты становятся непригодны.
С птичкой XP-совместимости (или в масштабе 100%), жесты в этом ПО работают нормально.
Может, где какую волшебную настройку в StrokesPlus пропустил, не?



https://www.youtube.com/watch?v=4uoN_knQkBE&ab_channel=Tehnik
Автор: PREVED
Дата сообщения: 16.02.2016 22:11
Edmanz

Цитата:
Программы эти не DPI-aware, насколько я понял. Тоесть масштабируются плохо, с замыливанием шрифтов. Но и жесты становятся непригодны.
С птичкой XP-совместимости (или в масштабе 100%), жесты в этом ПО работают нормально.
Может, где какую волшебную настройку в StrokesPlus пропустил, не?


Такой опции в S+ нет. Сам S+ начиная с версии 2.0.5 Beta стал DPI-aware (очевидно, подразумевается, что он стал таким по части реализации выполнения жестов). Цитата разработчика из changelog версии 2.0.5 Beta от 2012 года:

- Set S+ as DPI-aware. This was supposed to override DPI settings and seems to do so on Win XP, but not Win 7. However, it's usable at 125% and 150% so I'm not going to pursue for now.

Можете попробовать старую версию (до 2.0.5).

Также обязательно составьте пост с описанием проблемы на английском и отправьте разработчику на форум: http://www.strokesplus.com/forum/5/known-issues/

Он может отреагировать - внести в следующую версию исправления либо добавить опцию (не обязательно в диалог настроек, может и скрытую в xml-конфиге реализовать).

Страницы: 123456789

Предыдущая тема: Программа для скрытого захвата звука с микрофона


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