1

Тема: AHK: Статус цифр при вводе hotstring

Здравствуйте!

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

Другими словами, у меня есть хотстринг

:?*: --:: —

т. е. пробел два дефиса заменяются на неразрывный пробел и тире.

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

#Hotstring EndChars -()[]{}:;'"/\,.?!`n `t1234567890

ничего не меняется.

Такое поведение проявляется на почти всех моих хотстрингах.

Как решить эту проблему. Разве числа не воспринимаются как символы? Как их тогда зачислить к символам?

Спасибо за ответы.

2

Re: AHK: Статус цифр при вводе hotstring

У меня это не воспроизводится, работает нормально.

3

Re: AHK: Статус цифр при вводе hotstring

akhill, а у Вас клавиатуры классическая или какая-нибудь ноутбучная, урезанная?

4 (изменено: akhill, 2016-08-27 17:48:19)

Re: AHK: Статус цифр при вводе hotstring

У меня ноутбук, справа отдельно цифровые клавиши есть, нам-пад вроде так называется.

Да если вводить с цифры с этого нам-пада то все в порядке как оказывается. А привычней вводить цифры сверху. Может есть какой-то хук для этого?

Спасибо за ответы.

5

Re: AHK: Статус цифр при вводе hotstring

Возможно основные цифровые клавиши имеют дополнительные функции. И стоит драйвер, который определят что Вы делаете - просто нажимаете клавиши, или с удержанием Fn. Попробуйте убрать все драйверы и приложения, предназначенные для клавиатуры.

6

Re: AHK: Статус цифр при вводе hotstring

Посмотрел драйверы, вроде один майкрософтовский стандартная клавиатура PS/2. Пытался его обновить но система сказала, что тот, который стоит нормальный и оптимальный на текущий момент.

Так случилось, что я выгрузил все свои ahk-файлы из памяти и затем загрузил их в другом порядке, чем они прописаны в автозапуске (не знаю правда в каком порядке они системой при загрузке беруться, может кто подскажет?). Последним там стоял, если кому приходилось сталкиваться typingAid.ahk (помощник ускоренного ввода с клавиатуры). В этот раз я его запускал первым и ситуация поменялась в нужную мне сторону. Сам typingAid.ahk довольно большой скрипт. Думаю, что дело скорее всего в нем или в директивах, которые в нем находятся.

Спасибо за ответы.

7 (изменено: akhill, 2016-08-27 19:48:17)

Re: AHK: Статус цифр при вводе hotstring

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

Спасибо за ответы.

8

Re: AHK: Статус цифр при вводе hotstring

Нужно искать строки, в которых задействованы клавиши-цифры.

9

Re: AHK: Статус цифр при вводе hotstring

Вот фрагмент из typingAid.ahk

$1::
$2::
$3::
$4::
$5::
$6::
$7::
$8::
$9::
$0::
CheckWord(A_ThisHotkey)
Return

По идее CheckWord должен вернуть состояние, которое он изменяет в своем теле, чего он не делает по всей видимости.
Какое это может быть состояние и с помощью чего можно управлять возможностью вызова хоткея из хотстринга? 


; If hotkey was pressed, check wether there's a match going on and send it, otherwise send the number(s) typed 
CheckWord(Key)
{
   global g_ListBox_Id
   global g_Match
   global g_MatchStart
   global g_NumKeyMethod
   global g_SingleMatch
   global g_Word
   global prefs_ListBoxRows
   global prefs_NumPresses
   
   StringRight, Key, Key, 1 ;Grab just the number pushed, trim off the "$"
   
   IfEqual, Key, 0
   {
      WordIndex := g_MatchStart + 9
   } else {
            WordIndex := g_MatchStart - 1 + Key
         }  
   
   IfEqual, g_NumKeyMethod, Off
   {
      SendCompatible(Key,0)
      ProcessKey(Key,"")
      Return
   }
   
   IfEqual, prefs_NumPresses, 2
      SuspendOn()

   ; If active window has different window ID from before the input, blank word 
   ; (well, assign the number pressed to the word) 
   if !(ReturnWinActive())
   { 
      SendCompatible(Key,0)
      ProcessKey(Key,"")
      IfEqual, prefs_NumPresses, 2
         SuspendOff()
      Return 
   } 
   
   if ReturnLineWrong() ;Make sure we are still on the same line
   { 
      SendCompatible(Key,0)
      ProcessKey(Key,"") 
      IfEqual, prefs_NumPresses, 2
         SuspendOff()
      Return 
   } 

   IfNotEqual, g_Match, 
   {
      ifequal, g_ListBox_Id,        ; only continue if match is not empty and list is showing
      { 
         SendCompatible(Key,0)
         ProcessKey(Key,"")
         IfEqual, prefs_NumPresses, 2
            SuspendOff()
         Return 
      }
   }

   ifequal, g_Word,        ; only continue if g_word is not empty 
   { 
      SendCompatible(Key,0)
      ProcessKey(Key,"")
      IfEqual, prefs_NumPresses, 2
         SuspendOff()
      Return 
   }
      
   if ( ( (WordIndex + 1 - MatchStart) > prefs_ListBoxRows) || ( g_Match = "" ) || (g_SingleMatch[WordIndex] = "") )   ; only continue g_SingleMatch is not empty 
   { 
      SendCompatible(Key,0)
      ProcessKey(Key,"")
      IfEqual, prefs_NumPresses, 2
         SuspendOff()
      Return 
   }

   IfEqual, prefs_NumPresses, 2
   {
      Input, KeyAgain, L1 I T0.5, 1234567890
      
      ; If there is a timeout, abort replacement, send key and return
      IfEqual, ErrorLevel, Timeout
      {
         SendCompatible(Key,0)
         ProcessKey(Key,"")
         SuspendOff()
         Return
      }

      ; Make sure it's an EndKey, otherwise abort replacement, send key and return
      IfNotInString, ErrorLevel, EndKey:
      {
         SendCompatible(Key . KeyAgain,0)
         ProcessKey(Key,"")
         ProcessKey(KeyAgain,"")
         SuspendOff()
         Return
      }
   
      ; If the 2nd key is NOT the same 1st trigger key, abort replacement and send keys   
      IfNotInString, ErrorLevel, %Key%
      {
         StringTrimLeft, KeyAgain, ErrorLevel, 7
         SendCompatible(Key . KeyAgain,0)
         ProcessKey(Key,"")
         ProcessKey(KeyAgain,"")
         SuspendOff()
         Return
      }

      ; If active window has different window ID from before the input, blank word 
      ; (well, assign the number pressed to the word) 
      if !(ReturnWinActive())
      { 
         SendCompatible(Key . KeyAgain,0)
         ProcessKey(Key,"")
         ProcessKey(KeyAgain,"")
         SuspendOff()
         Return 
      } 
   
      if ReturnLineWrong() ;Make sure we are still on the same line
      { 
         SendCompatible(Key . KeyAgain,0)
         ProcessKey(Key,"")
         ProcessKey(KeyAgain,"")
         SuspendOff()
         Return 
      } 
   }

   SendWord(WordIndex)
   IfEqual, prefs_NumPresses, 2
      SuspendOff()
   Return 
}

Спасибо за любую наводку.

10

Re: AHK: Статус цифр при вводе hotstring

Скрипт typingAid.ahk перехватывает нажатия клавиш-цифр. Поэтому скрипт из первого сообщения не узнаёт об их нажатии.

11

Re: AHK: Статус цифр при вводе hotstring

Спасибо. Пока как временное решение закомментировал этот перехват.

; $1::
; $2::
; $3::
; $4::
; $5::
; $6::
; $7::
; $8::
; $9::
; $0::
; CheckWord(A_ThisHotkey)
; Return

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

Спасибо за ценные комментарии.