1

Тема: AHK: проверка возможности ввода текста

Предположим, что мы собрались отправить

Send, абракадабра

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

2

Re: AHK: проверка возможности ввода текста

А какой смысл отправлять абракадабру в незнакомую программу?

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

3

Re: AHK: проверка возможности ввода текста

Смысл в том, что это нужно моей программе (о которой я промолчу). Но могу предложить другой смысл: для хотстрингов тоже такая проверка не помешала бы.

4

Re: AHK: проверка возможности ввода текста

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

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

5

Re: AHK: проверка возможности ввода текста

У меня было две идеи:
проследить, обрабатывается ли WM_CHAR,
узнать, показывается ли на экране каретка.
Но это слишком сложно для меня. Сейчас нашёл какой-то код http://w3facility.org/question/how-to-f … -in-opera/

6

Re: AHK: проверка возможности ввода текста

WM_CHAR может обрабатываться независимо от активности поля ввода, наличие каретки способом по ссылке можно определить не везде:

F11::
   SendMessage, WM_CHAR := 0x102, Asc("a"), (GetKeySC("a") << 16) | 1,, A
   ResWM_CHAR := ErrorLevel
   
   AccObj := AccObjectFromWindow(WinExist("A"), OBJID_CARET := 0xFFFFFFF8)
   oLocation := AccLocation(AccObj)
   ToolTip % "координаты каретки: x = " oLocation.x ", y = " oLocation.y "`nResWM_CHAR = " ResWM_CHAR  ; если 0 значит обработано
   Return

AccInit()
{
   Static   h
   If Not   h
      h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   AccInit()
   If   DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF
      , "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81
      ,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
   Return   ComObjEnwrap(9,pacc,1)
}

AccLocation(Acc, ChildId=0, byref Position="")
{
   try Acc.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId)
   catch
      return
   Position := "x" NumGet(x,0,"int") " y" NumGet(y,0,"int") " w" NumGet(w,0,"int") " h" NumGet(h,0,"int")
   return   {x:NumGet(x,0,"int"), y:NumGet(y,0,"int"), w:NumGet(w,0,"int"), h:NumGet(h,0,"int")}
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: проверка возможности ввода текста

teadrinker пишет:

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

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

8

Re: AHK: проверка возможности ввода текста

a154802 пишет:

Я бы даже сказал, что нигде smile. Потому что у вас код не совсем полный.

Почему, в FF и в Опере определяется, если в фокусе адресная строка и в ней нет выделения.

А если вы про сишную версию, то пока я обнаружил проблемы с вижуальной штудией, вимом и возможно QT, но в целом я доволен. Первые два можно было бы просто внести в белый список.

Эту часть не понял.

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

9

Re: AHK: проверка возможности ввода текста

teadrinker пишет:

Почему, в FF и в Опере определяется, если в фокусе адресная строка и в ней нет выделения.

А у меня этот ahk-код везде показывает нули.

teadrinker пишет:

Эту часть не понял.

Белый список? Список программ, в которые можно что-нибудь отправлять без этой проверки на каретку.