VoxCommando

Help and Support (Using VoxCommando) => VoxCommando Basics and Core Features => Topic started by: NooBAsTiK on January 25, 2015, 09:45:45 AM

Title: Checking pressing
Post by: NooBAsTiK on January 25, 2015, 09:45:45 AM
Hey there! By not saying use English translator. I dig the program for 2 days. How to do a background check on pressing if the button has been pressed then leave me a message that it is already pressed, but if not then press it. This is for the game. :bonk
Title: Re: Checking pressing
Post by: jitterjames on January 25, 2015, 10:45:07 AM
Hi NooBAsTiK.

I think you probably want to use the "hook" plugin.
http://voxcommando.com/mediawiki/index.php?title=Plugin_Hook

This plugin can generate an event when you press or release a button.

I don't think there is any way to know if a button is already pressed or not, but you can use a variable to keep track of key press and and key release events.

You must enable the hook plugin, and tell it which keys to monitor.  (See the attached image.)

For example, when you press the left-Ctrl key on your keyboard, hook will generate this event:
Code: [Select]
<event>Hook.LControlKey</event>and when you release the key this event will be generated:
Code: [Select]
<event>Hook.LControlKey.Up</event>
You could use these events to monitor the current state of the Ctrl key.
Title: Re: Checking pressing
Post by: NooBAsTiK on January 25, 2015, 10:55:50 AM
Thank you very much, I think this is what you need. Try to understand.
Title: Re: Checking pressing
Post by: jitterjames on January 25, 2015, 12:48:24 PM
In the future, please feel free to post to the forum in Russian.
Title: Re: Checking pressing
Post by: NooBAsTiK on January 25, 2015, 02:28:57 PM
OK. Пытаюсь сделать запись видео по комаде голосом. Активация записи и дективация производиться кнопками LCTRL+R. Включил плагин добавил сочетание клавиш.
Создал событие в команде. Сделал логическую цепочку в комананде: "если запись не включена lctrl+r, если включена сообщение "запись уже идет". Что я делаю не так?
Title: Re: Checking pressing
Post by: jitterjames on January 25, 2015, 03:56:45 PM
I think it would help us if we knew what you are trying to do.  It would also help if we knew why you were trying to do this.  Maybe you can explain what you are trying to accomplish in the game.

One thing that is important to know is that the "DxInput.KeyCombo" action will press the keys and then release them after a very short delay.  If you need to keep the keys down for a very long time then you should use the action: "DxInput.KeyDown" which will press the keys and leave them pressed down.  Later you must use "DxInput.KeyUp" to release the keys!

If you use the action "DxInput.KeyDown" to press a key that has already been pressed down, nothing will happen, so I don't think you need to check if the key is already pressed down.

Finally, if you want to show us a command that you need help with, it is better to copy the command and then paste it into a code box like this, instead of uploading a jpg image:
Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<command id="589" name="show help" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>Help.ShowAll</cmdType>
    <params />
    <cmdRepeat>1</cmdRepeat>
  </action>
  <phrase>show help</phrase>
</command>
Title: Re: Checking pressing
Post by: nime5ter on January 25, 2015, 04:03:46 PM
This is how you can share commands or command groups:

http://www.screencast.com/t/0SOZw4TEvq9

Это, как вы можете легко поделиться команды или группы команд
Title: Re: Checking pressing
Post by: nime5ter on January 25, 2015, 06:03:58 PM
Based on jitterjames's advice in the post above, you may not need to use the "Hook" plugin. It depends on your final objective.

Here is an example of using "DxInput.KeyDown" and "DxInput.KeyUp" that uses logic and a variable to track the state of the button. I hope it helps.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<commandGroup open="True" name="Example of DXInput Key down/Key up" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="296" name="turn Flight assist off" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="Results.SetVar --&gt; create a variable called &quot;ctrl-r&quot; and set it to True.">
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.ctrl-r}&amp;&amp;True</ifParams>
      <then>
        <action>
          <cmdType>OSD.ShowText</cmdType>
          <params>
            <param>Flight assist is already off.</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>DxInput.KeyDown</cmdType>
          <params>
            <param>LeftControl</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>DxInput.KeyDown</cmdType>
          <params>
            <param>R</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>ctrl-r</param>
            <param>True</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>OSD.ShowText</cmdType>
          <params>
            <param>OK. Turning off flight assist.</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <phrase>turn Flight assist off</phrase>
  </command>
  <command id="298" name="Turn on flight assist" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>DxInput.KeyUp</cmdType>
      <params>
        <param>LeftControl</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>DxInput.KeyUp</cmdType>
      <params>
        <param>R</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>Results.SetVar</cmdType>
      <params>
        <param>ctrl-r</param>
        <param>False</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>Turning flight assist back on.</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>Turn on flight assist</phrase>
  </command>
</commandGroup>
Title: Re: Checking pressing
Post by: NooBAsTiK on January 26, 2015, 04:44:14 AM
Спасибо! Попробую когда вернусь домой.
Title: Re: Checking pressing
Post by: nime5ter on January 26, 2015, 11:24:03 AM
В предыдущем примере предполагается, что вы хотите проверить, есть ли кнопки по-прежнему нажата или нет. Мы были не уверены, если это то, что вы пытаетесь отслеживать. Если вы просто хотите, чтобы отслеживать, была ли кнопка была нажата один раз быстро, что немного отличается. Вы можете использовать "Hook" плагин с переменными в этой второй ситуации.

В следующем примере мы отслеживаем ли "Z" кнопка была нажата один раз быстро. Если нет, то программа будет нажать и отпустить кнопку "Z". Но после того, как кнопка была нажата один раз, то программа никогда не будет снова нажать кнопку, поскольку переменная остается "True". Вы можете изменить условия. Это лишь пример.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<commandGroup open="True" name="Elite Dangerous test" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="444" name="Switch on (включать)" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.toggle-z}&amp;&amp;True</ifParams>
      <then>
        <action>
          <cmdType>OSD.ShowText</cmdType>
          <params>
            <param>Я не буду ничего делать. Это было сделано раньше.</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.TriggerEvent</cmdType>
          <params>
            <param>Hook.Z</param>
          </params>
          <cmdRepeat>0</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>OSD.ShowText</cmdType>
          <params>
            <param>включать</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>DxInput.KeyPress</cmdType>
          <params>
            <param>z</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <phrase>Switch on, включать</phrase>
  </command>
  <command id="446" name="Set the variable (установить переменную)" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.toggle-z}&amp;&amp;False</ifParams>
      <then>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>toggle-z</param>
            <param>True</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>toggle-z</param>
            <param>False</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <event>VC.Loaded</event>
    <event>Hook.Z</event>
  </command>
</commandGroup>

The example in the previous post assumes that you want to check if a key combination is still pressed down or not. We were not sure if this is what you are actually trying to monitor. If you just want to keep track of whether the key has been pressed once, quickly, that is a little different. You can use the "Hook" plugin with variables in this second situation.

In the following example, we keep track of whether the "Z" key was pressed once quickly. If not, the program will press and release the "Z" key. But after it has been pressed once, the program will never again press the button, because the variable remains "true". You can change these conditions to be more sophisticated. This is just an example.
Title: Re: Checking pressing
Post by: NooBAsTiK on January 26, 2015, 02:40:49 PM
Очень хороший пример, я пока не совсем понимаю как работают переменные типа {var.togglez}, их много и описание на английском  ;)

A very good example, I do not quite understand how the variables of type {var.togglez}, a lot of them and a description in English;)
Title: Re: Checking pressing
Post by: jitterjames on January 26, 2015, 02:48:07 PM
Maybe this simple example will make it more clear.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<command id="1164" name="simple variable example." enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>Results.SetVar</cmdType>
    <params>
      <param>A</param>
      <param>Hello!</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.SetVar</cmdType>
    <params>
      <param>B</param>
      <param>Goodbye :'(</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>OSD.ShowText</cmdType>
    <params>
      <param>{Var.A}{CR}{Var.B}</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
</command>
Title: Re: Checking pressing
Post by: Phobophile on January 27, 2015, 09:04:19 AM
Очень хороший пример, я пока не совсем понимаю как работают переменные типа {var.togglez}, их много и описание на английском  ;)
На самом деле, переменных нужно не много, а всего одна в твоём случае, та, которая определяет была ли включена запись (например, isrecording со значениями 0 и 1)
Присвоить значение переменной можно с помощью команды Results.SetVar (http://voxcommando.com/mediawiki/index.php?title=Actions#SetVar).
Считать значение можно так - {var.isrecording}.
То есть, в случае команды "Включить запись" - проверяешь, что isrecording==0, посылаешь комбинацию клавиш ctrl+L, присваиваешь isrecording=1. В противном случае - говоришь "запись уже стартовала".
Ну и аналогично для "выключить запись", только наоборот.
К сожалению, нет под рукой сейчас VoxCommando, чтобы сгенерить примерный скрипт, но если что непонятно, то спрашивай.
Title: Re: Checking pressing
Post by: NooBAsTiK on January 27, 2015, 10:18:16 AM
Да у меня будет посложнее задача.
Кратно: Я играю в авиасимулятор и часто пользуюсь закрылками которые выпускаются от 0 до 60 градусов. Для себя определил 4 положения:
1. 0 градусов - полет
2. 8-9 градусов - боевое положение (время выпуска от 0 до 8-9 градусов около 3 секунд)
3. 17-18 градусов - взлет, маневрирование (от 8-9 около 5 секунд)
4. 50 градусов - посадка (от 18 около 9 секунд)

И вот тут получается следующий вопрос как выстроить логику:
Например я говорю "закрылки посадка"  надо держать кнопку 3+5+9=17 секунд, потом "закрылки боевое"  держать  кнопку которая убирает закрылки надо 9+5=14 секунд и так далее. Просто больше переменных делать? 
Title: Re: Checking pressing
Post by: Phobophile on January 27, 2015, 11:13:53 AM
Я бы сделал одну переменную, которая в разных режимах равна количеству секунд удержания кнопки выпуска закрылок, то есть 0, 3, 8, 17.
Потом можно сделать маппинг (http://voxcommando.com/mediawiki/index.php?title=Maps) - это файл, содержащий пары ключ-значение, в твоем случае будет: 0-полёт, 3- боевое, 8-взлет, 17 - посадка.
Таким образом, в экшене VoxCommando у тебя будут доступен входной параметр, содержащий время удержания от нуля (скажем, для "закрылки боевое" - 3) и переменная текущего состояния (например, посадка = 17). Сравниваешь два значения и определяешь какую из кнопок держать и сколько секунд.
Title: Re: Checking pressing
Post by: NooBAsTiK on January 27, 2015, 02:10:00 PM
На словах то конечно просто :) Попробую разобраться про маппинг смотрел видео, вроде ничего сложного, хотя по английский хромает...
Title: Re: Checking pressing
Post by: Phobophile on January 27, 2015, 02:41:04 PM
На словах то конечно просто :) Попробую разобраться про маппинг смотрел видео, вроде ничего сложного, хотя по английский хромает...
Попробуй, если не получится, то могу попробовать сделать примерный скрипт, просто ща под рукой VC нет и времени особо тоже. :)
Title: Re: Checking pressing
Post by: NooBAsTiK on January 28, 2015, 06:56:18 AM
В выходные попробую, если не будет получаться отпишусь  :)
Title: Re: Checking pressing
Post by: NooBAsTiK on January 31, 2015, 11:45:18 AM
Не понимаю что я делаю не так:
Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.3-->
<commandGroup open="True" name="La-5" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="94" name="Запись полета" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.rec}&amp;&amp;0</ifParams>
      <then>
        <action>
          <cmdType>DxInput.KeyCombo</cmdType>
          <params>
            <param>{LeftControl}</param>
            <param>{R}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>rec</param>
            <param>1</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись включена</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись уже идет</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>{var.rec}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>Записать полет,запись полета,включить запись,сохранить запись</phrase>
  </command>
  <command id="107" name="Остановить запись" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.rec}&amp;&amp;1</ifParams>
      <then>
        <action>
          <cmdType>DxInput.KeyCombo</cmdType>
          <params>
            <param>{LeftControl}</param>
            <param>{R}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>{var.rec}</param>
            <param>0</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись выключена</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись не была включена</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>{var.rec}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>Остановить запись,Сохранить запись,Прекратить запись</phrase>
  </command>
</commandGroup>

Вроде должно переключать переменную, а не переключает. Что я делаю не так?

I do not know what I'm doing wrong:

code

Like should switch variable rather than switches. What am I doing wrong?
Title: Re: Checking pressing
Post by: jitterjames on January 31, 2015, 12:44:06 PM
When you start VoxCommando the variable has no value.  The way you created your logic block, both commands will fail because the variable is not equal to either 0 or 1.

Also in your second command ("stop recording"), you have entered the wrong parameter in the Results.Setvar action.  You have written {var.rec} but you should have written rec.  The "start recording" command was done correctly.

I changed the logic for you.  The attached commands should work.  I changed:

Code: [Select]
if (rec==0) to
Code: [Select]
if (rec <> 1)and
Code: [Select]
if (rec==1) to
Code: [Select]
if (rec <> 0)
This way they will work when the variable has not been assigned a value yet.

Remember:

1) If you are already recording when VoxCommando first starts then you will have a problem.

2) If you manually press Ctrl-R on your keyboard VoxCommando will not know about it and your variable will have the wrong value, and your voice commands will not work correctly until you press Ctrl-R again.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<commandGroup open="True" name="La-5" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="94" name="Запись полета" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="True">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.rec}&amp;&amp;1</ifParams>
      <then>
        <action>
          <cmdType>DxInput.KeyCombo</cmdType>
          <params>
            <param>{LeftControl}</param>
            <param>{R}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>rec</param>
            <param>1</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись включена</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись уже идет</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>{var.rec}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>Записать полет,запись полета,включить запись,сохранить запись</phrase>
  </command>
  <command id="107" name="Остановить запись" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="True">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.rec}&amp;&amp;0</ifParams>
      <then>
        <action>
          <cmdType>DxInput.KeyCombo</cmdType>
          <params>
            <param>{LeftControl}</param>
            <param>{R}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>rec</param>
            <param>0</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись выключена</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись не была включена</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>{var.rec}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>Остановить запись,Сохранить запись,Прекратить запись</phrase>
  </command>
</commandGroup>
Title: Re: Checking pressing
Post by: NooBAsTiK on January 31, 2015, 12:51:58 PM
As someone who can link VoxCommando and keyboard?
Title: Re: Checking pressing
Post by: nime5ter on January 31, 2015, 01:03:51 PM
Yes. You can use the "Hook" plugin. :)

Enable the "Hook" plugin. You must log (record) the "Ctrl+R" in the Hook plugin settings and "Add Selected" to the list. Then VoxCommando will generate an event every time you press those buttons, or if you emulate that key combination using "DxInput.Combo".

Add this command to your group:
Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<command id="261" name="keyboard monitor" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <if ifBlockDisabled="False" ifNot="True">
    <ifType>(A)==(B)</ifType>
    <ifParams>{var.rec}&amp;&amp;1</ifParams>
    <then>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>rec</param>
          <param>1</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>rec</param>
          <param>0</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <event>Hook.LControlKey+R</event>
</command>
Title: Re: Checking pressing
Post by: NooBAsTiK on January 31, 2015, 01:13:24 PM
Как я понял на каждую переменную создавать такую строку?

As I understand it to each variable to create a line like this?
Title: Re: Checking pressing
Post by: nime5ter on January 31, 2015, 01:16:11 PM
Yes.
Title: Re: Checking pressing
Post by: NooBAsTiK on January 31, 2015, 01:25:34 PM
Этот хук может отследить время удержания кнопки? 1 сек 2 сек?

the "Hook" plugin can keep track of time holding the button? 1 sec 2 sec?
Title: Re: Checking pressing
Post by: nime5ter on January 31, 2015, 01:33:57 PM
As someone who can link VoxCommando and keyboard?

First: I forgot to say that if you are monitoring the variable using the Hook event, then you should not use the Results.SetVar action in the voice commands.

The correct implementation is:
Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<commandGroup open="True" name="La-5 -NEW" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="94" name="Запись полета" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="True">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.rec}&amp;&amp;1</ifParams>
      <then>
        <action>
          <cmdType>DxInput.KeyCombo</cmdType>
          <params>
            <param>{LeftControl}</param>
            <param>{R}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>rec</param>
            <param>1</param>
          </params>
          <cmdRepeat>0</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись включена</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись уже идет</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>{var.rec}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>Записать полет,запись полета,включить запись,сохранить запись</phrase>
  </command>
  <command id="261" name="keyboard monitor" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="True">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.rec}&amp;&amp;1</ifParams>
      <then>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>rec</param>
            <param>1</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>rec</param>
            <param>0</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <event>Hook.LControlKey+R</event>
  </command>
  <command id="107" name="Остановить запись" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="True">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.rec}&amp;&amp;0</ifParams>
      <then>
        <action>
          <cmdType>DxInput.KeyCombo</cmdType>
          <params>
            <param>{LeftControl}</param>
            <param>{R}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>rec</param>
            <param>0</param>
          </params>
          <cmdRepeat>0</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись выключена</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Запись не была включена</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>{var.rec}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>Остановить запись,Сохранить запись,Прекратить запись</phrase>
  </command>
</commandGroup>
Title: Re: Checking pressing
Post by: nime5ter on January 31, 2015, 02:06:54 PM
Этот хук может отследить время удержания кнопки? 1 сек 2 сек?

the "Hook" plugin can keep track of time holding the button? 1 sec 2 sec?

Yes and no. It would be better if we understood why you want to do this. There may be a better method to accomplish the same result.

However, without understanding the objective:

If you use the "Hook" plugin in combination with the "Python" plugin, you can probably keep track of time holding the button.

Example: (Python plugin must be enabled in "Options". Python is needed for the calculation.)

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<commandGroup open="True" name="Time in seconds" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="288" name="z key pressed" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>Results.SetVar</cmdType>
      <params>
        <param>zKey</param>
        <param>{DtCustom.mss}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <event>Hook.Z</event>
  </command>
  <command id="294" name="z key released" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>PY.ExecString</cmdType>
      <params>
        <param>result={DtCustom.mss}-{var.zKey}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>Time z key was pressed: {LastResult} seconds</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <event>Hook.Z.Up</event>
  </command>
</commandGroup>

Currently, this only works with single keys because you need to calculate the time between the "Hook.[key]" event and the "Hook.[key].Up" event.

This is because the "Hook" plugin does not generate a "Hook.[key+key].Up" event right now.

I think there is probably a different way to accomplish what you want that will be less complicated.
Title: Re: Checking pressing
Post by: NooBAsTiK on January 31, 2015, 02:14:02 PM
Да у меня будет посложнее задача.
Кратно: Я играю в авиасимулятор и часто пользуюсь закрылками которые выпускаются от 0 до 60 градусов. Для себя определил 4 положения:
1. 0 градусов - полет
2. 8-9 градусов - боевое положение (время выпуска от 0 до 8-9 градусов около 3 секунд)
3. 17-18 градусов - взлет, маневрирование (от 8-9 около 5 секунд)
4. 50 градусов - посадка (от 18 около 9 секунд)

И вот тут получается следующий вопрос как выстроить логику:
Например я говорю "закрылки посадка"  надо держать кнопку 3+5+9=17 секунд, потом "закрылки боевое"  держать  кнопку которая убирает закрылки надо 9+5=14 секунд и так далее. Просто больше переменных делать?
Yes, I will be more difficult task.
Multiples: I play flight simulator and often use the flaps are released from 0 to 60 degrees. Set for ourselves four points:
1. 0 degrees - flight
2. 8-9 degrees - firing position (release time from 0 to 8.9 degrees for about 3 seconds)
3. 17-18 degrees - takeoff, maneuvering (from 8-9 for about 5 seconds)
4. 50 degrees - planting (approximately 18 seconds 9)

And here we have the following question is how to build the logic:
For example, I say "landing flaps" must hold the button 3 + 5 + 9 = 17 seconds, then "flaps combat" hold button which removes the flaps must be 9 + 5 = 14 seconds and so on. Just more variables do?
Title: Re: Checking pressing
Post by: nime5ter on January 31, 2015, 02:17:06 PM
Have you tried Phobophile's recommendation? Вы пробовали Phobophile рекомендации?

I thought he suggested a method using "maps" or "payload xml"?

---

One clarification about my example in the previous post. У меня есть еще одна вещь, чтобы объяснить, о мой пример в предыдущем посте ...

Переменная "{DtCustom.mss}" - это Текущее время в минутах и секундах. Если Текущее время 21:15:33, переменная "{DtCustom.mss}" = 1533.

"DtCustom" is an abbreviation for "Date" "Time" "Customization". We use Microsoft time variables: https://msdn.microsoft.com/ru-ru/library/8kb3ddd4(v=vs.90).aspx

Title: Re: Checking pressing
Post by: jitterjames on January 31, 2015, 02:34:47 PM
I think voice control should be used to assist in flight simulation.  Some things are better done manually.

If I was playing a car driving game, I would not use voice control for steering.  I might use it for other things like gear up and gear down or for a quick look in the rear view mirror, so that I could keep my hands on the steering wheel.
Title: Re: Checking pressing
Post by: NooBAsTiK on January 31, 2015, 02:52:16 PM
Some operations take a long time, and would not want them distracted while holding the button.
Title: Re: Checking pressing
Post by: NooBAsTiK on January 31, 2015, 02:55:21 PM
Have you tried Phobophile's recommendation? Вы пробовали Phobophile рекомендации?

Пока нет, еле разобрался с записью.

Yet, barely figured out the record.
Title: Re: Checking pressing
Post by: nime5ter on January 31, 2015, 04:13:03 PM
Quote
Да у меня будет посложнее задача.
Кратно: Я играю в авиасимулятор и часто пользуюсь закрылками которые выпускаются от 0 до 60 градусов. Для себя определил 4 положения:
1. 0 градусов - полет
2. 8-9 градусов - боевое положение (время выпуска от 0 до 8-9 градусов около 3 секунд)
3. 17-18 градусов - взлет, маневрирование (от 8-9 около 5 секунд)
4. 50 градусов - посадка (от 18 около 9 секунд)

И вот тут получается следующий вопрос как выстроить логику:
Например я говорю "закрылки посадка"  надо держать кнопку 3+5+9=17 секунд, потом "закрылки боевое"  держать  кнопку которая убирает закрылки надо 9+5=14 секунд и так далее. Просто больше переменных делать?

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

Какие кнопки?

Do you use the same keys for all four tasks? Or would you have to keep track of different key combinations?

What are the keys?
Title: Re: Checking pressing
Post by: NooBAsTiK on January 31, 2015, 04:44:05 PM
Две кнопки.
1 выпускает
2 убирает

Two buttons.
1 releases
2 removes

1 F
2 Lshift+f
Title: Re: Checking pressing
Post by: nime5ter on January 31, 2015, 04:50:36 PM
OK.

Let me think about it.  Позвольте мне думать об этом
Title: Re: Checking pressing
Post by: jitterjames on January 31, 2015, 05:28:15 PM
Is the other command that we modified for you today working properly?

The best way to do solve your problem for controlling the flaps is probably to use a bit of simple math. This means that you will need to enable the python plugin.

I can try to create a working command for you, but it will only work if you always use voice control to control the flaps.  If you use the keyboard to move the flaps it will cause problems and I don't think there is a practical solution for that.
Title: Re: Checking pressing
Post by: PegLegTV on January 31, 2015, 09:48:10 PM

I can try to create a working command for you, but it will only work if you always use voice control to control the flaps.  If you use the keyboard to move the flaps it will cause problems and I don't think there is a practical solution for that.

If you want to use the keyboard at times you could use something like AutoHotKey, so when you use the shortcut keys they could trigger an event in VC,

I have an Autohotkey script that I converted to an .exe file, when executed it tells VC to launch Pseudo TV Live in xbmc, so that way VC can keep track of when Pseudo TV Live is On or Off
Title: Re: Checking pressing
Post by: jitterjames on January 31, 2015, 11:25:54 PM
Yes, you can also do that with the hook plugin, but in this case we are talking about keeping track of how long the button is held down for, and although it could theoretically be done, I think it is more trouble than it is worth.
Title: Re: Checking pressing
Post by: PegLegTV on February 01, 2015, 01:22:20 AM
Yes, you can also do that with the hook plugin, but in this case we are talking about keeping track of how long the button is held down for, and although it could theoretically be done, I think it is more trouble than it is worth.

I agree, it can be a lot of trouble,

I knew I had come across an autohotkey script that looks like it could do what NooBAsTiK was looking for, it would just need to be modified so it could send an event with a payload for the amount of time the key was held down instead of sending a letter

i just couldn't find it before but here's what i thought he could use
http://www.autohotkey.com/board/topic/97786-variable-in-counter-script/ (http://www.autohotkey.com/board/topic/97786-variable-in-counter-script/)
Title: Re: Checking pressing
Post by: NooBAsTiK on February 01, 2015, 06:07:08 AM
Спасибо! Это код для Pyton?

Thank U! This code Pyton?
Title: Re: Checking pressing
Post by: NooBAsTiK on February 01, 2015, 06:22:33 AM
я думаю, что попробую сделать через мап. С написанием кода в питоне слишком сложно, это всетаки игра :)

I think I'll try to do through the MAP. From writing code in Python too difficult, it is certainly this game :)
Title: Re: Checking pressing
Post by: PegLegTV on February 01, 2015, 12:09:36 PM
Спасибо! Это код для Pyton?

Thank U! This code Pyton?


If you're asking about what I posted, no it's not Python, it's another form of script, (I find it easier than Python, but not as powerful).

Если вы спрашиваете о том, что я написал, нет, это не Питон, это еще одна форма сценария, (мне проще, чем Python, но не такой мощный).
Title: Re: Checking pressing
Post by: Phobophile on February 01, 2015, 03:10:56 PM
Ну примерно вот так, я думаю.
I think, something like this:

Code: [Select]
<commandGroup open="True" name="Flight Sim" enabled="True" prefix="" priority="0" requiredProcess="" description="">
<command id="108" name="Flight Mode" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
<if ifBlockDisabled="False" ifNot="False">
<ifType>(A)&lt;(B)</ifType>
<ifParams>{var.mode}&amp;&amp;{1}</ifParams>
<then>
<action>
<cmdType>PY.ExecString</cmdType>
<params>
<param>result = {1} - {var.mode}</param>
</params>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>OSD.ShowText</cmdType>
<params>
<param>Открываем закрылки {LastResult} секунд</param>
</params>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>Results.SetVar</cmdType>
<params>
<param>mode</param>
<param>{1}</param>
</params>
<cmdRepeat>1</cmdRepeat>
</action>
</then>
<else>
<action>
<cmdType>PY.ExecString</cmdType>
<params>
<param>result = {var.mode} - {1}</param>
</params>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>OSD.ShowText</cmdType>
<params>
<param>Закрываем закрылки {LastResult} секунд</param>
</params>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>Results.SetVar</cmdType>
<params>
<param>mode</param>
<param>{1}</param>
</params>
<cmdRepeat>1</cmdRepeat>
</action>
</else>
</if>
<phrase>Закрылки</phrase>
<payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\flightsim.xml</payloadFromXML>
</command>
</commandGroup>

В папку payloads надо будет сунуть прилагаемый файл. Саму логику удержания клавиш не делал, ограничился подсчётом необходимых секунд и определением направления движения закрылок. И да, понятное дело, это работает, если клавиатуру для управления закрылками не использовать вообще. В противном случае нужно как-то отлавливать удержание клавиш, возможно, поможет что-то типа Eventghost.

You should also put the attached file in your "payloads" directory. I didn't implement the key pressing itself, this command just prints the direction of flaps and the number of seconds that key needs to be pressed. And yes, this works only if you don't use your keyboard to control flaps at the same time. Otherwise, you need to track keys holding. Maybe, something like Eventghost can help.
Title: Re: Checking pressing
Post by: Phobophile on February 01, 2015, 03:27:06 PM
When you start VoxCommando the variable has no value.  The way you created your logic block, both commands will fail because the variable is not equal to either 0 or 1.
By the way, is there any way to initialize the variable when VoxCommando starts? Or to check if it was initialized, something like "IsNull"?
Title: Re: Checking pressing
Post by: jitterjames on February 01, 2015, 05:47:02 PM
Yes, the VC.Loaded event is what we normally use for initializing stuff.
Title: Re: Checking pressing
Post by: jitterjames on February 01, 2015, 05:50:09 PM
Anything in curly brackets that is not recognized or has no value will be left unchanged so you can check if a variable is null like this:

I am an idiot.  As Nime5ter points out.  This will always be true!  :bonk :bonk :bonk

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.7-->
<command id="1243" name="check if variable is null" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)==(B)</ifType>
    <ifParams>{Var.test}&amp;&amp;{Var.test}</ifParams>
    <then>
      <action>
        <cmdType>OSD.ShowText</cmdType>
        <params>
          <param>the test variable is null</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else />
  </if>
</command>
Title: Re: Checking pressing
Post by: jitterjames on February 01, 2015, 06:03:07 PM
user variables of the form {var.??} will actually be blank (as in "") when they are not initialized so here is the test command that actually works!

Run it once and it will say it is null, but will assign it a value.  Run it again and it will show the value.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<command id="1243" name="check if variable is null" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)==(B)</ifType>
    <ifParams>{Var.test}&amp;&amp;</ifParams>
    <then>
      <action>
        <cmdType>OSD.ShowText</cmdType>
        <params>
          <param>the test variable is null.  Setting it to "OK"</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>test</param>
          <param>OK</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>OSD.ShowText</cmdType>
        <params>
          <param>the test variable is: {Var.test}</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
</command>
Title: Re: Checking pressing
Post by: nime5ter on February 04, 2015, 04:11:50 PM
Ну примерно вот так, я думаю.
I think, something like this:

Phobophile's example was a good start. Here is a command group that is based on his example.

I'm sorry that I used English in the commands, but better than bad Russian. ;)

If you don't understand it, let me know. Then I can try to explain.

Again, this will only work if you use voice commands only. If you also use the buttons F and LeftShift F on your keyboard, then VoxCommando will no longer know what mode you are in and the math will be incorrect.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.7-->
<commandGroup open="True" name="Flight Sim with DXInput" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="108" name="Flight Mode" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.eventSet}&amp;&amp;True</ifParams>
      <then>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Please wait still executing last order.</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.StopMacro</cmdType>
          <params />
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else />
    </if>
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.mode}&amp;&amp;</ifParams>
      <then>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>mode</param>
            <param>0</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.StopMacro</cmdType>
          <params />
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else />
    </if>
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.mode}&amp;&amp;{1}</ifParams>
      <then>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Maintaining current flap position.</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.StopMacro</cmdType>
          <params />
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else />
    </if>
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)&lt;(B)</ifType>
      <ifParams>{var.mode}&amp;&amp;{1}</ifParams>
      <then>
        <action>
          <cmdType>PY.ExecString</cmdType>
          <params>
            <param>result = abs({1} - {var.mode})</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Opening flaps for {LastResult} seconds</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>OSD.ShowText</cmdType>
          <params>
            <param>Opening flaps for {LastResult} seconds</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>DxInput.KeyDown</cmdType>
          <params>
            <param>F</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.SetEventTimer</cmdType>
          <params>
            <param>{LastResult}s</param>
            <param>releaseKey</param>
            <param>F</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>eventSet</param>
            <param>True</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>mode</param>
            <param>{1}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>PY.ExecString</cmdType>
          <params>
            <param>result = abs({var.mode} - {1})</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Retracting flaps for {LastResult} seconds</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>OSD.ShowText</cmdType>
          <params>
            <param>Retracting flaps for {LastResult} seconds</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>DxInput.KeyDown</cmdType>
          <params>
            <param>leftshift</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>DxInput.KeyDown</cmdType>
          <params>
            <param>F</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.SetEventTimer</cmdType>
          <params>
            <param>{LastResult}s</param>
            <param>releaseKey</param>
            <param>F</param>
            <param>leftshift</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>eventSet</param>
            <param>True</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>mode</param>
            <param>{1}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <phrase>enter, switch to, choose, release, retract, begin</phrase>
    <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\flightsim.xml</payloadFromXML>
    <event>vc.loaded</event>
  </command>
  <command id="206" name="release key" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>DxInput.KeyUp</cmdType>
      <params>
        <param>{1}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>DxInput.KeyUp</cmdType>
      <params>
        <param>{2}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>Results.SetVar</cmdType>
      <params>
        <param>eventSet</param>
        <param>False</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>TTS.Speak</cmdType>
      <params>
        <param>Okay</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <event>releaseKey</event>
  </command>
</commandGroup>

Yandex says:
Phobophile пример был хороший старт. Вот команда, группа, которая основана на его примере.

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

Если вы этого не понимаете, дайте мне знать. Тогда я могу попробовать объяснить.

Опять же, это будет работать только если вы используете только на голосовые команды. Если Вы также использовать кнопки F и LeftShift F на клавиатуре, затем VoxCommando больше не знаю, в каком режиме вы находитесь и математический расчет будет неверным.
Title: Re: Checking pressing
Post by: NooBAsTiK on February 08, 2015, 02:09:48 PM
Thank you so much. I find it hard to understand how it works :) I tried this code. A release (F) works well, but does not want to clean up ...
Title: Re: Checking pressing
Post by: NooBAsTiK on February 08, 2015, 02:10:47 PM
Makes an instant press
Title: Re: Checking pressing
Post by: nime5ter on February 08, 2015, 02:24:00 PM
Hi,

I don't understand exactly what you are saying.

Can you please "Enable Log" in "Options"? http://voxcommando.com/mediawiki/index.php?title=Log

Then use the commands in order to demonstrate the problem.

Then add the file "voxLog.txt" here, so that we can try to understand what is happening?

---
Yandex says:

Привет,

Я не понимаю именно то, что вы говорите.

Можете вы, пожалуйста, "включить Лог" (Enable Log) в "параметры" (Options)? http://voxcommando.com/mediawiki/index.php?title=Log

Затем с помощью команды, чтобы продемонстрировать проблему.

Затем добавить файл "voxLog.txt" здесь, так что мы можем попытаться понять, что происходит?
Title: Re: Checking pressing
Post by: nime5ter on February 08, 2015, 03:14:09 PM
I see.

DxInput.KeyDown does not appear to be working in the way I expected.

I don't know if this is my misunderstanding or not. It will take me some time to investigate.
Title: Re: Checking pressing
Post by: nime5ter on February 08, 2015, 03:59:48 PM
We have now tested "DxInput.KeyDown" and "DxInput.KeyUp" with a video game. Both are working correctly.

"DxInput.KeyDown" emulates pressing the button down until "DxInput.KeyUp" occurs.

   

 У нас сейчас тестируется "DxInput.KeyDown" и "DxInput.KeyUp" с видео игры. Оба работают правильно.

"DxInput.KeyDown" эмулирует нажатие кнопки "вниз" до тех пор, пока "DxInput.KeyUp" происходит.
Title: Re: Checking pressing
Post by: jitterjames on February 08, 2015, 04:16:48 PM
We tested with "Dragon Age Inquisition" on Win7 and it seems to work fine.  We tested with a command to press W down (using DxInput.KeyDown W) to start walking, and another command using DxInput.KeyUp W  to stop walking.

It worked as expected.

There are no keyboard combinations in Dragon Age so we were not able to test holding down shift and a letter.
Title: Re: Checking pressing
Post by: NooBAsTiK on February 08, 2015, 05:05:23 PM
I do not know ....
the lshift+f does not work.
Title: Re: Checking pressing
Post by: NooBAsTiK on February 08, 2015, 05:11:50 PM
vox says what will be done time passes, said confirmation but nothing happens
Title: Re: Checking pressing
Post by: nime5ter on February 08, 2015, 05:23:54 PM
Hi,

I don't understand exactly what you are saying.

Can you please "Enable Log" in "Options"? http://voxcommando.com/mediawiki/index.php?title=Log

Then use the commands in order to demonstrate the problem.

Then add the file "voxLog.txt" here, so that we can try to understand what is happening?

---
Yandex says:

Привет,

Я не понимаю именно то, что вы говорите.

Можете вы, пожалуйста, "включить Лог" (Enable Log) в "параметры" (Options)? http://voxcommando.com/mediawiki/index.php?title=Log

Затем с помощью команды, чтобы продемонстрировать проблему.

Затем добавить файл "voxLog.txt" здесь, так что мы можем попытаться понять, что происходит?
Title: Re: Checking pressing
Post by: NooBAsTiK on February 09, 2015, 02:08:03 AM
How do I get home, I will do
Title: Re: Checking pressing
Post by: NooBAsTiK on February 09, 2015, 02:17:48 PM
here it is
Title: Re: Checking pressing
Post by: NooBAsTiK on February 09, 2015, 03:00:33 PM
I think I understand what the Problem

Code: [Select]
09.02.2015 21:14:31 991 action result: KeyDown emulated
09.02.2015 21:14:31 991 action repeat set to: 1
09.02.2015 21:14:31 991 Action:  VC.SetEventTimer - 17s&&releaseKey&&F&&LeftShift
09.02.2015 21:14:31 991 [action] VC.SetEventTimer:17s&&releaseKey&&F&&LeftShift

If you press F + Left Shift does not work
If you press Left Shift + F, then this works
Title: Re: Checking pressing
Post by: nime5ter on February 09, 2015, 03:37:22 PM
I hope you are right. If that is true, it is easy to fix. :)

Replace the command "Закрылки":

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.7-->
<command id="108" name="Закрылки" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)==(B)</ifType>
    <ifParams>{var.eventSet}&amp;&amp;True</ifParams>
    <then>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>Please wait still executing last order.</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>VC.StopMacro</cmdType>
        <params />
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else />
  </if>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)==(B)</ifType>
    <ifParams>{var.mode}&amp;&amp;</ifParams>
    <then>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>mode</param>
          <param>0</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>VC.StopMacro</cmdType>
        <params />
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else />
  </if>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)==(B)</ifType>
    <ifParams>{var.mode}&amp;&amp;{1}</ifParams>
    <then>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>Maintaining current flap position.</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>VC.StopMacro</cmdType>
        <params />
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else />
  </if>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)&lt;(B)</ifType>
    <ifParams>{var.mode}&amp;&amp;{1}</ifParams>
    <then>
      <action>
        <cmdType>PY.ExecString</cmdType>
        <params>
          <param>result = abs({1} - {var.mode})</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>Будут выпущены через {LastResult} секунды</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>OSD.ShowText</cmdType>
        <params>
          <param>Будут выпущены через {LastResult} секунды</param>
        </params>
        <cmdRepeat>0</cmdRepeat>
      </action>
      <action>
        <cmdType>DxInput.KeyDown</cmdType>
        <params>
          <param>F</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>VC.SetEventTimer</cmdType>
        <params>
          <param>{LastResult}s</param>
          <param>releaseKey</param>
          <param>F</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>eventSet</param>
          <param>True</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>mode</param>
          <param>{1}</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>PY.ExecString</cmdType>
        <params>
          <param>result = abs({var.mode} - {1})</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>Будут убраны через {LastResult} секунды</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>OSD.ShowText</cmdType>
        <params>
          <param>Будут убраны через {LastResult} секунды</param>
        </params>
        <cmdRepeat>0</cmdRepeat>
      </action>
      <action>
        <cmdType>DxInput.KeyDown</cmdType>
        <params>
          <param>leftshift</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>DxInput.KeyDown</cmdType>
        <params>
          <param>F</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>VC.SetEventTimer</cmdType>
        <params>
          <param>{LastResult}s</param>
          <param>releaseKey</param>
          <param>leftshift</param>
          <param>f</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>eventSet</param>
          <param>True</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>mode</param>
          <param>{1}</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <phrase>enter, switch to, choose, release, retract, begin</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\flightsim.xml</payloadFromXML>
  <event>vc.loaded</event>
</command>

Or edit the one line yourself (see image)
 Вы можете редактировать VC.SetEventTimer" линии на вашей собственной (См. изображение)

Title: Re: Checking pressing
Post by: NooBAsTiK on February 09, 2015, 05:31:19 PM
does not work
Title: Re: Checking pressing
Post by: nime5ter on February 09, 2015, 05:34:52 PM
Does "F" work?
Title: Re: Checking pressing
Post by: nime5ter on February 09, 2015, 05:40:52 PM
If "F" is OK

But "Shift + F" is not OK, you can try to add a short pause (VC.Pause) between "leftshift" and "F":

... I think it will probably not help, but you can try.

Если "F" - это ОК

Но "Shift + F" - это не ОК, можно попробовать добавить короткой паузы (VC.Pause) между "leftshift" и "F":

... Я думаю, что это, вероятно, не поможет, но попробовать можно.
Title: Re: Checking pressing
Post by: NooBAsTiK on February 10, 2015, 02:05:29 AM
Thank U.How do I get home, I will do
Title: Re: Checking pressing
Post by: NooBAsTiK on February 10, 2015, 02:13:03 AM
Вопрос. Можно изменить процент распознания, при котором вокс включает команду? Сейчас как я понял 80%.

Question. You can change the percentage of recognition, in which the vox includes a command? Now as I understand 80%.
Title: Re: Checking pressing
Post by: PegLegTV on February 10, 2015, 02:29:31 AM
should find what you need here: http://voxcommando.com/mediawiki/index.php?title=Options#Required_Confidence (http://voxcommando.com/mediawiki/index.php?title=Options#Required_Confidence)

должны найти то, что вам нужно здесь : http://voxcommando.com/mediawiki/index.php?title=Options#Required_Confidence (http://voxcommando.com/mediawiki/index.php?title=Options#Required_Confidence)
Title: Re: Checking pressing
Post by: NooBAsTiK on February 10, 2015, 03:14:08 AM
Thank
Title: Re: Checking pressing
Post by: NooBAsTiK on February 10, 2015, 02:41:11 PM
Заработало!
Earned! It worked!
Title: Re: Checking pressing
Post by: nime5ter on February 10, 2015, 03:03:52 PM
 ::banana
Title: Re: Checking pressing
Post by: NooBAsTiK on February 10, 2015, 03:20:59 PM
http://voxcommando.com/mediawiki/index.php?title=Options#Required_Confidence (http://voxcommando.com/mediawiki/index.php?title=Options#Required_Confidence)

And where changing this percentage?
Title: Re: Checking pressing
Post by: nime5ter on February 10, 2015, 03:32:50 PM
See image.
Title: Re: Checking pressing
Post by: nime5ter on February 10, 2015, 03:37:23 PM
Do not lower the percentage too much, or the program will think every sound in the room is a command.

To play videogames, it is best to use a headset with a microphone. It is important that the microphone is closer to your mouth than the computer's audio output.

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

Играть в видеоигры, лучше использовать гарнитуру с микрофоном. Важно, что микрофон находится ближе ко рту, чем компьютер с аудио-выходом.
Title: Re: Checking pressing
Post by: NooBAsTiK on February 12, 2015, 08:46:53 AM
Спасибо. Играю в гарнитуре.

Thank U. Play in the headset.
Title: Re: Checking pressing
Post by: nime5ter on February 12, 2015, 10:54:06 AM
Watch the volume meter.

≤ 30% is OK.

Loud is bad.

Title: Re: Checking pressing
Post by: NooBAsTiK on February 12, 2015, 02:01:38 PM
I have about 5-10%
Title: Re: Checking pressing
Post by: nime5ter on February 20, 2015, 11:01:25 AM
If VoxCommando recognizes voice commands when volume levels show 5-10%, then great.

If not, you can try experimenting with your microphone input levels. This is done in the Windows sound settings, not in VoxCommando.



Title: Re: Checking pressing
Post by: Link on January 30, 2019, 05:20:03 PM
Здравствуйте! Я как и автор темы тоже увлекаюсь авиасимуляторами, и мне очень помогла эта ветка форума. Но у меня возникла пара вопросов.

1. В посте #45 nime5ter показал пример, как можно изменять положения закрылков отслеживая время нажатия клавиш.
Теперь сам вопрос - сколько может быть таких команд в пределах одной Group Collection?
Если, например, я хочу в этой же группе сделать подобное управление не только для закрылков, но и для радиаторов двигателей(открытие/закрытие), управление шагом винта и топливновоздушной смесью? Простое копирование приводит к конфликту этих двух команд, не говоря о трех или четырех. Как их можно разделить или сделать так чтобы они друг другу не мешали?

2.Плагин DxInput. В настройках плагина есть возможность изменить продолжительность нажатия комбинации клавиш. Его можно изменить и сохранить изменения. Но они сохраняются только до перезапуска программы. После закрытия и повторного открытия VoxCommando - значения сбрасываются. По умолчанию стоит 5 миллисекунд, но некоторым играм требуется несколько большее время в пределах 8-10 миллисекунд, иначе они не видят нажатия сочетаний клавиш.
Это так задумано, или это баг у меня?

Заранее спасибо за ответ, но если даже не ответите - тоже не обижусь :)))
Title: Re: Checking pressing
Post by: jitterjames on January 30, 2019, 06:34:33 PM
Hello Link. Thanks for posting.

#1 You can have many commands in a group.  Hundreds is probably OK.

I am not sure what you mean by a conflict.  Can you provide more information please?

Note that every group must have a unique name.  Commands should have unique phrases that are used to trigger the command because there is no way for VoxCommando to know which command you want.  If you put the commands in different groups and you only enable one group at a time, then it is OK for commands to have the same phrases because only the command in a group that is enabled will be recognized.

#2 Is a bug.  I am surprised no person ever mentioned this before.  Thanks for telling us.  Here is a fixed version of the plugin (DxInput.dll attached)

See notes for downloading dll files: https://voxcommando.com/mediawiki/index.php?title=Unblock_DLL
Title: Re: Checking pressing
Post by: Link on January 31, 2019, 04:43:58 AM
Попробую объяснить что я делаю. Например, я создаю новую Group Collection - "Flightsim", затем в ней новую группу "Закрылки". В  неё помещаю код из поста #47  и прикрепленный файл в папку payloads. Переназначаю на нужные мне клавиши. Запускаю авиасимулятор, проверяю - всё работает. Затем делаю такую же группу, но уже для управления радиаторами двигателя. Создаю новый payload файл для этой группы, с другим названием и временем срабатывания. Радиаторы полностью открываются за 4 секунды. Сохраняю, делаю перезапуск Voxcommdo и на этом всё перестаёт работать. Voxcommdo без команды самостоятельно пытается что то открыть, на другие команды реагирует только сообщением - "Выполняется предыдущая команда". Я понимаю что из меня программист как из слона балерина, но хотелось бы понять что я делаю не так::confused
Code: [Select]
<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands version="2.2.1.6" space="preserve" date="1/31/2019 12:00:00 AM">
    <groupCollection open="True" name="Flysim">
        <commandGroup open="True" name="Закрылки" enabled="True" prefix="" priority="0" requiredProcess="" description="">
            <command id="178" name="Закрылки" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
                <if ifBlockDisabled="False" ifNot="False">
                    <ifType>(A)==(B)</ifType>
                    <ifParams>{var.eventSet}&amp;&amp;True</ifParams>
                    <then>
                        <action>
                            <cmdType>TTS.Speak</cmdType>
                            <params>
                                <param>Выполняется предыдущая команда.</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.StopMacro</cmdType>
                            <params />
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </then>
                    <else />
                </if>
                <if ifBlockDisabled="False" ifNot="False">
                    <ifType>(A)==(B)</ifType>
                    <ifParams>{var.mode}&amp;&amp;</ifParams>
                    <then>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>mode</param>
                                <param>0</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.StopMacro</cmdType>
                            <params />
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </then>
                    <else />
                </if>
                <if ifBlockDisabled="False" ifNot="False">
                    <ifType>(A)==(B)</ifType>
                    <ifParams>{var.mode}&amp;&amp;{1}</ifParams>
                    <then>
                        <action>
                            <cmdType>TTS.Speak</cmdType>
                            <params>
                                <param>Закрылки в выбраной позиции.</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.StopMacro</cmdType>
                            <params />
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </then>
                    <else />
                </if>
                <if ifBlockDisabled="False" ifNot="False">
                    <ifType>(A)&lt;(B)</ifType>
                    <ifParams>{var.mode}&amp;&amp;{1}</ifParams>
                    <then>
                        <action>
                            <cmdType>PY.ExecString</cmdType>
                            <params>
                                <param>result = abs({1} - {var.mode})</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>TTS.Speak</cmdType>
                            <params>
                                <param>Выпуск закрылок через {LastResult} секунд</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>DxInput.KeyDown</cmdType>
                            <params>
                                <param>F</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.SetEventTimer</cmdType>
                            <params>
                                <param>{LastResult}s</param>
                                <param>releaseKey</param>
                                <param>F</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>eventSet</param>
                                <param>True</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>mode</param>
                                <param>{1}</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </then>
                    <else>
                        <action>
                            <cmdType>PY.ExecString</cmdType>
                            <params>
                                <param>result = abs({var.mode} - {1})</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>TTS.Speak</cmdType>
                            <params>
                                <param>Уборка закрылок через {LastResult} секунд</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>DxInput.KeyDown</cmdType>
                            <params>
                                <param>K</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.SetEventTimer</cmdType>
                            <params>
                                <param>{LastResult}s</param>
                                <param>releaseKey</param>
                                <param>K</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>eventSet</param>
                                <param>True</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>mode</param>
                                <param>{1}</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </else>
                </if>
                <phrase>Закрылки</phrase>
                <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\flaps.xml</payloadFromXML>
                <event>vc.loaded</event>
            </command>
            <command id="274" name="release key" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
                <action>
                    <cmdType>DxInput.KeyUp</cmdType>
                    <params>
                        <param>{1}</param>
                    </params>
                    <cmdRepeat>1</cmdRepeat>
                </action>
                <action>
                    <cmdType>DxInput.KeyUp</cmdType>
                    <params>
                        <param>{2}</param>
                    </params>
                    <cmdRepeat>1</cmdRepeat>
                </action>
                <action>
                    <cmdType>Results.SetVar</cmdType>
                    <params>
                        <param>eventSet</param>
                        <param>False</param>
                    </params>
                    <cmdRepeat>1</cmdRepeat>
                </action>
                <action>
                    <cmdType>TTS.Speak</cmdType>
                    <params>
                        <param>Есть!</param>
                    </params>
                    <cmdRepeat>1</cmdRepeat>
                </action>
                <event>releaseKey</event>
            </command>
        </commandGroup>
        <commandGroup open="True" name="Радиаторы" enabled="True" prefix="" priority="0" requiredProcess="" description="">
            <command id="180" name="Радиторы" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
                <if ifBlockDisabled="False" ifNot="False">
                    <ifType>(A)==(B)</ifType>
                    <ifParams>{var.eventSet}&amp;&amp;True</ifParams>
                    <then>
                        <action>
                            <cmdType>TTS.Speak</cmdType>
                            <params>
                                <param>Выполняется предыдущая команда.</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.StopMacro</cmdType>
                            <params />
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </then>
                    <else />
                </if>
                <if ifBlockDisabled="False" ifNot="False">
                    <ifType>(A)==(B)</ifType>
                    <ifParams>{var.mode}&amp;&amp;</ifParams>
                    <then>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>mode</param>
                                <param>0</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.StopMacro</cmdType>
                            <params />
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </then>
                    <else />
                </if>
                <if ifBlockDisabled="False" ifNot="False">
                    <ifType>(A)==(B)</ifType>
                    <ifParams>{var.mode}&amp;&amp;{1}</ifParams>
                    <then>
                        <action>
                            <cmdType>TTS.Speak</cmdType>
                            <params>
                                <param>Створки в выбраной позиции.</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.StopMacro</cmdType>
                            <params />
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </then>
                    <else />
                </if>
                <if ifBlockDisabled="False" ifNot="False">
                    <ifType>(A)&lt;(B)</ifType>
                    <ifParams>{var.mode}&amp;&amp;{1}</ifParams>
                    <then>
                        <action>
                            <cmdType>PY.ExecString</cmdType>
                            <params>
                                <param>result = abs({1} - {var.mode})</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>TTS.Speak</cmdType>
                            <params>
                                <param>Открытие створок через {LastResult} секунд</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>DxInput.KeyDown</cmdType>
                            <params>
                                <param>Z</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.SetEventTimer</cmdType>
                            <params>
                                <param>{LastResult}s</param>
                                <param>releaseKey</param>
                                <param>Z</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>eventSet</param>
                                <param>True</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>mode</param>
                                <param>{1}</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </then>
                    <else>
                        <action>
                            <cmdType>PY.ExecString</cmdType>
                            <params>
                                <param>result = abs({var.mode} - {1})</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>TTS.Speak</cmdType>
                            <params>
                                <param>Закрытие створок через {LastResult} секунд</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>DxInput.KeyDown</cmdType>
                            <params>
                                <param>X</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>VC.SetEventTimer</cmdType>
                            <params>
                                <param>{LastResult}s</param>
                                <param>releaseKey</param>
                                <param>X</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>eventSet</param>
                                <param>True</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                        <action>
                            <cmdType>Results.SetVar</cmdType>
                            <params>
                                <param>mode</param>
                                <param>{1}</param>
                            </params>
                            <cmdRepeat>1</cmdRepeat>
                        </action>
                    </else>
                </if>
                <phrase>Радиаторы</phrase>
                <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\radiators.xml</payloadFromXML>
                <event>vc.loaded</event>
            </command>
            <command id="276" name="release key" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
                <action>
                    <cmdType>DxInput.KeyUp</cmdType>
                    <params>
                        <param>{1}</param>
                    </params>
                    <cmdRepeat>1</cmdRepeat>
                </action>
                <action>
                    <cmdType>DxInput.KeyUp</cmdType>
                    <params>
                        <param>{2}</param>
                    </params>
                    <cmdRepeat>1</cmdRepeat>
                </action>
                <action>
                    <cmdType>Results.SetVar</cmdType>
                    <params>
                        <param>eventSet</param>
                        <param>False</param>
                    </params>
                    <cmdRepeat>1</cmdRepeat>
                </action>
                <action>
                    <cmdType>TTS.Speak</cmdType>
                    <params>
                        <param>Есть!</param>
                    </params>
                    <cmdRepeat>1</cmdRepeat>
                </action>
                <event>releaseKey</event>
            </command>
        </commandGroup>
    </groupCollection>
</VoiceCommands>

PS Попробовал заменить DxInput.dll на тот что вы прикрепили в предыдущем посту, после этого плагин DxInput у меня вообще исчез из списка установленных плагинов.
Title: Re: Checking pressing
Post by: jitterjames on January 31, 2019, 08:09:11 AM
PS Попробовал заменить DxInput.dll на тот что вы прикрепили в предыдущем посту, после этого плагин DxInput у меня вообще исчез из списка установленных плагинов.

See notes for downloading dll files: https://voxcommando.com/mediawiki/index.php?title=Unblock_DLL
Title: Re: Checking pressing
Post by: Link on January 31, 2019, 08:50:04 AM
Да, моя ошибка. Прошу прощения, поторопился. В плагине DxInput теперь всё сохраняется. Спасибо! :)
Title: Re: Checking pressing
Post by: jitterjames on January 31, 2019, 10:31:40 AM
It is a very complex command.  You can't just make a copy of it with minor changes.  The conflict is caused by the fact that both commands are using the same variables and events.

Unfortunately I did not write the original command.  I am not familiar with flight simulators, and I can't read Russian so it is difficult for me to solve your problem.  To fix it someone will first need to really understand everything that is happening in the original command.

If you are lucky you might just be able to modify the second command to make sure the variables and event names are different from the first command, but the chances of making a mistake are quite high.
Title: Re: Checking pressing
Post by: nime5ter on February 02, 2019, 12:00:27 PM
You do not need a separate folder for each command, unless it helps you to find commands in your command tree.

Each unique command must use its own variable. Otherwise, the two commands interfere with one another.

In the XML that you posted, you were using the same variable ({var.mode}) to control two separate functions ("flaps" and "radiators").

I have now deleted all {var.mode} references and replaced it with two unique variables: {var.flaps} and {var.radiators}.

The following commands function. I do not know if they accomplish what you need, but they work. :)


Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.2.4.5-->
<commandGroup open="True" name="FlightSim control" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="133" name="инициализировать переменные" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>Results.SetVar</cmdType>
      <params>
        <param>flaps</param>
        <param>0</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>Results.SetVar</cmdType>
      <params>
        <param>radiators</param>
        <param>0</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <event>vc.loaded</event>
  </command>
  <command id="188" name="Закрылки" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.eventSet}&amp;&amp;True</ifParams>
      <then>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Выполняется предыдущая команда.</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.StopMacro</cmdType>
          <params />
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else />
    </if>
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.flaps}&amp;&amp;{1}</ifParams>
      <then>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Закрылки в выбраной позиции.</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.StopMacro</cmdType>
          <params />
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else />
    </if>
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)&lt;(B)</ifType>
      <ifParams>{var.flaps}&amp;&amp;{1}</ifParams>
      <then>
        <action>
          <cmdType>PY.ExecString</cmdType>
          <params>
            <param>result = abs({1} - {var.flaps})</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Выпуск закрылок через {LastResult} секунд</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>DxInput.KeyDown</cmdType>
          <params>
            <param>F</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.SetEventTimer</cmdType>
          <params>
            <param>{LastResult}s</param>
            <param>releaseKey</param>
            <param>F</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>eventSet</param>
            <param>True</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>flaps</param>
            <param>{1}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>PY.ExecString</cmdType>
          <params>
            <param>result = abs({var.flaps} - {1})</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Уборка закрылок через {LastResult} секунд</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>DxInput.KeyDown</cmdType>
          <params>
            <param>K</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.SetEventTimer</cmdType>
          <params>
            <param>{LastResult}s</param>
            <param>releaseKey</param>
            <param>K</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>eventSet</param>
            <param>True</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>flaps</param>
            <param>{1}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <phrase>Закрылки</phrase>
    <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\flaps.xml</payloadFromXML>
  </command>
  <command id="190" name="Радиторы" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.eventSet}&amp;&amp;True</ifParams>
      <then>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Выполняется предыдущая команда.</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.StopMacro</cmdType>
          <params />
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else />
    </if>
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)==(B)</ifType>
      <ifParams>{var.radiators}&amp;&amp;{1}</ifParams>
      <then>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Створки в выбраной позиции.</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.StopMacro</cmdType>
          <params />
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else />
    </if>
    <if ifBlockDisabled="False" ifNot="False">
      <ifType>(A)&lt;(B)</ifType>
      <ifParams>{var.radiators}&amp;&amp;{1}</ifParams>
      <then>
        <action>
          <cmdType>PY.ExecString</cmdType>
          <params>
            <param>result = abs({1} - {var.radiators})</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Открытие створок через {LastResult} секунд</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>DxInput.KeyDown</cmdType>
          <params>
            <param>Z</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.SetEventTimer</cmdType>
          <params>
            <param>{LastResult}s</param>
            <param>releaseKey</param>
            <param>Z</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>eventSet</param>
            <param>True</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>radiators</param>
            <param>{1}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </then>
      <else>
        <action>
          <cmdType>PY.ExecString</cmdType>
          <params>
            <param>result = abs({var.radiators} - {1})</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>TTS.Speak</cmdType>
          <params>
            <param>Закрытие створок через {LastResult} секунд</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>DxInput.KeyDown</cmdType>
          <params>
            <param>X</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>VC.SetEventTimer</cmdType>
          <params>
            <param>{LastResult}s</param>
            <param>releaseKey</param>
            <param>X</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>eventSet</param>
            <param>True</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
        <action>
          <cmdType>Results.SetVar</cmdType>
          <params>
            <param>radiators</param>
            <param>{1}</param>
          </params>
          <cmdRepeat>1</cmdRepeat>
        </action>
      </else>
    </if>
    <phrase>Радиаторы</phrase>
    <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\radiators.xml</payloadFromXML>
  </command>
  <command id="236" name="release key" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>DxInput.KeyUp</cmdType>
      <params>
        <param>{1}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>DxInput.KeyUp</cmdType>
      <params>
        <param>{2}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>Results.SetVar</cmdType>
      <params>
        <param>eventSet</param>
        <param>False</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>TTS.Speak</cmdType>
      <params>
        <param>Есть!</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <event>releaseKey</event>
  </command>
</commandGroup>
Title: Re: Checking pressing
Post by: nime5ter on February 02, 2019, 12:12:09 PM
PS - In order to properly test the new commands, you will need to:

1. Create a backup copy of your old "Flysim" commands on your computer.

2. In VoxCommando, delete the old commands.

3. Copy and paste the new XML into your command tree. Save and close the command tree.

4. Restart VoxCommando.

5. Now you can try the new commands.

Title: Re: Checking pressing
Post by: Link on February 06, 2019, 02:39:59 AM
Спасибо большое за ответ, теперь я вижу что начал искать ошибку совсем не там. :)
Вот пример того что делал я на основе вашей команды из из поста #47:
Code: [Select]
<?xml version="1.0" encoding="utf-8" ?>
- <VoiceCommands version="2.2.1.6" space="preserve" date="2/6/2019 12:00:00 AM">
  <groupCollection open="False" name="Flysim" />
- <commandGroup open="True" name="Закрылки" enabled="True" prefix="" priority="0" requiredProcess="" description="">
- <command id="211" name="Закрылки" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
- <if ifBlockDisabled="False" ifNot="False">
  <ifType>(A)==(B)</ifType>
  <ifParams>{var.eventFLAPS}&&True</ifParams>
- <then>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Выполняется предыдущая команда закрылки.</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.StopMacro</cmdType>
  <params />
  <cmdRepeat>1</cmdRepeat>
  </action>
  </then>
  <else />
  </if>
- <if ifBlockDisabled="False" ifNot="False">
  <ifType>(A)==(B)</ifType>
  <ifParams>{var.flaps}&&</ifParams>
- <then>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>flaps</param>
  <param>0</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.StopMacro</cmdType>
  <params />
  <cmdRepeat>1</cmdRepeat>
  </action>
  </then>
  <else />
  </if>
- <if ifBlockDisabled="False" ifNot="False">
  <ifType>(A)==(B)</ifType>
  <ifParams>{var.flaps}&&{1}</ifParams>
- <then>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Закрылки в выбраной позиции.</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.StopMacro</cmdType>
  <params />
  <cmdRepeat>1</cmdRepeat>
  </action>
  </then>
  <else />
  </if>
- <if ifBlockDisabled="False" ifNot="False">
  <ifType>(A)<(B)</ifType>
  <ifParams>{var.flaps}&&{1}</ifParams>
- <then>
- <action>
  <cmdType>PY.ExecString</cmdType>
- <params>
  <param>result = abs({1} - {var.flaps})</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Выпуск закрылок через {LastResult} секунд</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>DxInput.KeyDown</cmdType>
- <params>
  <param>F</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.SetEventTimer</cmdType>
- <params>
  <param>{LastResult}s</param>
  <param>releaseKey</param>
  <param>F</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>eventFLAPS</param>
  <param>True</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>flaps</param>
  <param>{1}</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
  </then>
- <else>
- <action>
  <cmdType>PY.ExecString</cmdType>
- <params>
  <param>result = abs({var.flaps} - {1})</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Уборка закрылок через {LastResult} секунд</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>DxInput.KeyDown</cmdType>
- <params>
  <param>K</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.SetEventTimer</cmdType>
- <params>
  <param>{LastResult}s</param>
  <param>releaseKey</param>
  <param>K</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>eventFLAPS</param>
  <param>True</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>flaps</param>
  <param>{1}</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
  </else>
  </if>
  <phrase>Закрылки</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\flaps.xml</payloadFromXML>
  <event>vc.loaded</event>
  </command>
- <command id="307" name="release key" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
- <action>
  <cmdType>DxInput.KeyUp</cmdType>
- <params>
  <param>{1}</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>DxInput.KeyUp</cmdType>
- <params>
  <param>{2}</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>eventFLAPS</param>
  <param>False</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Есть!</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
  <event>releaseKey</event>
  </command>
  </commandGroup>
- <commandGroup open="True" name="Радиаторы" enabled="True" prefix="" priority="0" requiredProcess="" description="">
- <command id="193" name="Радиаторы" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
- <if ifBlockDisabled="False" ifNot="False">
  <ifType>(A)==(B)</ifType>
  <ifParams>{var.eventRADS}&&True</ifParams>
- <then>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Выполняется предыдущая команда радиаторы.</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.StopMacro</cmdType>
  <params />
  <cmdRepeat>1</cmdRepeat>
  </action>
  </then>
  <else />
  </if>
- <if ifBlockDisabled="False" ifNot="False">
  <ifType>(A)==(B)</ifType>
  <ifParams>{var.rads}&&</ifParams>
- <then>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>rads</param>
  <param>0</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.StopMacro</cmdType>
  <params />
  <cmdRepeat>1</cmdRepeat>
  </action>
  </then>
  <else />
  </if>
- <if ifBlockDisabled="False" ifNot="False">
  <ifType>(A)==(B)</ifType>
  <ifParams>{var.rads}&&{3}</ifParams>
- <then>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Створки выбраной позиции.</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.StopMacro</cmdType>
  <params />
  <cmdRepeat>1</cmdRepeat>
  </action>
  </then>
  <else />
  </if>
- <if ifBlockDisabled="False" ifNot="False">
  <ifType>(A)<(B)</ifType>
  <ifParams>{var.rads}&&{3}</ifParams>
- <then>
- <action>
  <cmdType>PY.ExecString</cmdType>
- <params>
  <param>result = abs({3} - {var.rads})</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Открою через {LastResult} секунд</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>DxInput.KeyDown</cmdType>
- <params>
  <param>z</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.SetEventTimer</cmdType>
- <params>
  <param>{LastResult}s</param>
  <param>releaseKey</param>
  <param>z</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>eventRADS</param>
  <param>True</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>rads</param>
  <param>{3}</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
  </then>
- <else>
- <action>
  <cmdType>PY.ExecString</cmdType>
- <params>
  <param>result = abs({var.rads} - {3})</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Закрою через {LastResult} секунд</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>DxInput.KeyDown</cmdType>
- <params>
  <param>x</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>VC.SetEventTimer</cmdType>
- <params>
  <param>{LastResult}s</param>
  <param>releaseKey</param>
  <param>x</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>eventRADS</param>
  <param>True</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>rads</param>
  <param>{3}</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
  </else>
  </if>
  <phrase>Радиаторы</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\radiators.xml</payloadFromXML>
  <event>vc.loaded</event>
  </command>
- <command id="288" name="release key" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
- <action>
  <cmdType>DxInput.KeyUp</cmdType>
- <params>
  <param>{3}</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>DxInput.KeyUp</cmdType>
- <params>
  <param>{4}</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>Results.SetVar</cmdType>
- <params>
  <param>eventRADS</param>
  <param>False</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
- <action>
  <cmdType>TTS.Speak</cmdType>
- <params>
  <param>Есть!</param>
  </params>
  <cmdRepeat>1</cmdRepeat>
  </action>
  <event>releaseKey</event>
  </command>
  </commandGroup>
  </VoiceCommands>
Title: Re: Checking pressing
Post by: Link on February 06, 2019, 02:57:49 AM
You do not need a separate folder for each command, unless it helps you to find commands in your command tree.

Each unique command must use its own variable. Otherwise, the two commands interfere with one another.

In the XML that you posted, you were using the same variable ({var.mode}) to control two separate functions ("flaps" and "radiators").

I have now deleted all{var.mode} references and replaced it with two unique variables: {var.flaps} and {var.radiators}.

The following commands function. I do not know if they accomplish what you need, but they work. :)

Спасибо Вам огромное! Работает!!!
Это именно то, что я хотел сделать, но у меня не получалось! :bonk
:)

И еще один вопрос - можно ли задать время нажатия клавиши меньше 1 секунды, к примеру 0,5 секунды?
 
Title: Re: Checking pressing
Post by: jitterjames on February 06, 2019, 07:49:04 AM

И еще один вопрос - можно ли задать время нажатия клавиши меньше 1 секунды, к примеру 0,5 секунды?

Unfortunately VC.SetEventTimer uses seconds as the smallest unit of time.

To get a half second you would need another method such as VC.Pause, which uses milliseconds.
Title: Re: Checking pressing
Post by: Link on February 06, 2019, 09:50:00 AM
Unfortunately VC.SetEventTimer uses seconds as the smallest unit of time.

To get a half second you would need another method such as VC.Pause, which uses milliseconds.

Спасибо за ответ! :)