1 (изменено: Kialtor, 2012-05-14 18:16:25)

Тема: AHK: Проверка орфографии в Skype

Добрый день.
Помогите, пожалуйста, со скриптом.
Надо, чтобы при появлении в фокусе любого чата Skype (или при mouse1 на нем), скрипт посылал сочетание клавиш в это окно. Например, F7.
Для Скайпа есть замечательный бесплатный спелчекер Ursa Speller, но в нем не реализован автозапуск, надо в каждом окне включать его ручками.
Заранее спасибо

2

Re: AHK: Проверка орфографии в Skype

Пожалуйста, помогите разобраться.

3

Re: AHK: Проверка орфографии в Skype

Попробуй так:

Chat := "TChatRichEdit1"   ; уточнить название контрола с чатом для своей версии Skype
WindowsWithChat := []

Loop
{
   ID := WinExist("A")
   WinWait, ahk_id %ID%
   WinGet, List, ControlList
   if List contains %Chat%
   {
      WinInList := ""
      for k,v in WindowsWithChat
         if (v = ID)
            WinInList := 1
         
      if !WinInList
      {
         WindowsWithChat.Insert(ID)
         ControlFocus, %Chat%
         SendInput, {F7}   ; здесь прописать нужные клавиши
      }
   }
   WinWaitNotActive
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Проверка орфографии в Skype

Global hMsgWnd,WndClass:="TConversationForm.UnicodeClass",Wnd:=WndClass,CtrlClass:="TChatRichEdit.UnicodeClass1"
Gui, +HwndhMsgWnd
DllCall("RegisterShellHookWindow","uint",hMsgWnd)
MsgNum:=DllCall("RegisterWindowMessage","str","SHELLHOOK")
OnMessage(MsgNum,"ShellMessage")
Return

ShellMessage(wParam,lParam)
{
	Static HSHELL_WINDOWACTIVATED:=4
	If (wParam=HSHELL_WINDOWACTIVATED)
	{
		DllCall("GetClassName","uint",lParam,"str",Wnd,"int",31)
		if (Wnd=WndClass)
		SetTimer, CheckFocusedControl, -250
	}
}
  
CheckFocusedControl:
ControlGetFocus, Ctrl, ahk_class %WndClass%
if ErrorLevel=0
if (Ctrl=CtrlClass)
{
	ControlGet, CtrlHwnd,Hwnd,,%CtrlClass%, ahk_class %WndClass%
	if (CtrlHwnd<>LastCtrlHwnd)
	{
		Send,^{F7}
		TrayTip,,Проверка орфографии включена ; %LastCtrlHwnd%  %CtrlHwnd%
		LastCtrlHwnd:=CtrlHwnd
	}
}
return

Esc::
DllCall("DeregisterShellHookWindow","uint",hMsgWnd)
ExitApp

5

Re: AHK: Проверка орфографии в Skype

Замечательные примеры. Добавлю свои пять копеек, дабы превентивно  подсказать ТС «в каком направлении копать, если что-то непонятно».

Надо, чтобы при появлении в фокусе любого чата Skype […] скрипт [перечисление требуемых операций]

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

Ниже — упрощенный вариант второго примера, разбавленный комментариями.


DllCall("RegisterShellHookWindow", "uint", A_ScriptHwnd)        ; 1) Регистрируем скрытое окно скрипта в качестве «получателя уведомления об изменении активного окна»
MsgNum := DllCall("RegisterWindowMessage", "str", "SHELLHOOK")
OnMessage(MsgNum, "WindowActivated")                            ; 2) При получении сообщения о событии будет выполняться функция с именем WindowActivated…
OnExit, Esc
return

WindowActivated(wParam, lParam)                                 ; 3) …в которую будут переданы два параметра…
{
    global activatedWindowHwnd  ; Глобальная переменная сохраняющая значение id окна для отображения в TrayTip
    if (wParam = 4)                                             ; 4) …первый из них содержит «тип события»…
    {
        activatedWindowHwnd := lParam                           ; 5) …второй — Id окна, которое в данном случае (wParam=4) стало активным
        SetTimer, TrayTip, -250 ; Таймер запускает действия выполняемые от метки до return в отдельном псевдопотоке.
    }
}

TrayTip:
    TrayTip,, %activatedWindowHwnd% ; traytip для демонстрации, что вариант всё-ещё работает
    return

Esc::
    DllCall("DeregisterShellHookWindow", "uint", A_ScriptHwnd) ; действие очевидно из имени функции.
    ExitApp

6

Re: AHK: Проверка орфографии в Skype

Тогда уж до кучи:

#Persistent
EVENT_OBJECT_FOCUS := 0x8005

HookProcAdr := RegisterCallback("HookProc", "F")
DllCall("SetWinEventHook" , UInt, EVENT_OBJECT_FOCUS, UInt, EVENT_OBJECT_FOCUS, UInt, 0
                          , Ptr, HookProcAdr, UInt, 0, UInt, 0, UInt, 0)
return

HookProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
{
   WinGet, ProcessName, ProcessName, A
   if ProcessName not contains Skype
      return
   
   WinGetClass, Class, ahk_id %hwnd%
   if Class contains Chat
      Send, {F7}   ; здесь прописать нужные клавиши
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder