Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

AutoHotkey

Автор Квас, сентября 8, 2010, 11:42

0 Пользователи и 1 гость просматривают эту тему.

Joris

Цитата: Квас от июля  7, 2012, 12:42
И везде такой эффект?
сейчас проверил — вроде только в ворде. В опере торн вводится нормально Þþ, ý тоже без проблем. А вот кириллицу пока не проверю, нужно ее загонять туда.
yóó' aninááh

Joris

Можно ли сделать так, чтобы при смене раскалдки на китайскую, скрипт автоматически становился на паузу, а при смене с китайской на любую другую снова запускался?
yóó' aninááh

Квас

Цитата: Juuurgen от июля 10, 2012, 19:25
Можно ли сделать так, чтобы при смене раскалдки на китайскую, скрипт автоматически становился на паузу, а при смене с китайской на любую другую снова запускался?

Если речь о том, чтобы горячие клавиши/горячие строки не работали, то этого можно достичь с помощью #If:

#If <условие>

Все нижеследующие горячие клавиши и строки будут работать только при выполнении условия. Это распространяется на всё, что под данной строкой вплоть до нового #If/#IfWinActive/...

В данном случае можно воспользоваться функцией

GetActiveKeyboardLayout()
{
    WinGet, WinID,, A
    ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
    InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
    return, InputLocaleID
}

Она возвращает код активной раскладки. Функцию можно описать в любом месте скрипта, обычно их описывают в начале. Тогда условие будет иметь вид
#If GetActiveKeyboardLayout() = <код китайской раскладки>
А чтобы узнать код китайской раскладки, можно воспользоваться той же функцией:

F12::
SetFormat, Integer, h
MsgBox % GetActiveKeyboardLayout()
return


Кстати говоря, с помощью AHK очень удобно переключать раскладки. Я для этого пользуюсь такой функцией:

SetLayout(Layout)
; The function accepts hexadecimal layout code
; or one of specific strings as its argument.
{
    ControlGetFocus, C, A
    If (Layout = "English")
    {
        PostMessage, 0x50,, 0x4090409, %C%, A
    }
    Else If (Layout = "Russian")
        PostMessage, 0x50,, 0x4190419, %C%, A
    Else If (Layout = "Russian_mash")
        PostMessage, 0x50,, 0xf0080419, %C%, A
    Else
        PostMessage, 0x50,, %Layout%, %C%, A
}

То есть для включения английской раскладки я пишу в скриптах SetLayout("English"). По образу и подобию туда можно и других строчек насовать:

    Else If (Layout = "Chinese")
        PostMessage, 0x50,, <код китайской>, %C%, A
Пишите письма! :)

mnashe

Цитата: Juuurgen от июля 10, 2012, 19:25
Можно ли сделать так, чтобы при смене раскалдки на китайскую, скрипт автоматически становился на паузу, а при смене с китайской на любую другую снова запускался?
1. Можно переключать на китайскую самим AHK, тогда параллельно переключению раскладки ставить на паузу автозамены.
2. Можно ставить на паузу по тому же сочетанию клавиш, которым переключаешь.
3. Можно периодически опрашивать, но это нерационально.
Нужные функции можно выдрать из моего скрипта:
;Switch the active window's keyboard layout/language:
LangSwitch(layout)
{
  ControlGetFocus,ctl,A
  SendMessage, 0x50, 0, layout, %ctl%, A ;WM_INPUTLANGCHANGEREQUEST
}

GetInputLocaleId()
{
  SetFormat, Integer, H
  WinGet, WinId,, A
  ThreadId:=DllCall("GetWindowThreadProcessId", UInt, WinId, UInt, 0)
  Return DllCall("GetKeyboardLayout", UInt, ThreadId, UInt)
}

#1::LangSwitch(0x04090409) ; to English

#2::
LangSwitch(0xF0C00419) ; to Russian
sleep 100
LangSwitch(0xF0C00419)
return

#3::
LangSwitch(0xF0C20419) ; to Russian
sleep 100
LangSwitch(0xF0C20419)
return

#4::LangSwitch(0xF0C1040D) ; to Hebrew

^+`::
InputLocaleId:=GetInputLocaleId()
MsgBox, %InputLocaleId%

^CapsLock::
If (GetInputLocaleId()==0x04090409)
{
  LangSwitch(0xF0C00419)
  sleep 100
  LangSwitch(0xF0C00419)
  return
}
LangSwitch(0x04090409)
return
Адепт единственного числа и безродового склонения
שָׁלוֹם עֲלֵיכֶם!

Joris

Цитата: Квас от июля 10, 2012, 19:48
Если речь о том, чтобы горячие клавиши/горячие строки не работали
да :)
Цитата: Квас от июля 10, 2012, 19:48
Она возвращает код активной раскладки. Функцию можно описать в любом месте скрипта, обычно их описывают в начале. Тогда условие будет иметь вид
#If GetActiveKeyboardLayout() = <код китайской раскладки>
т.е. мне нужно указать те раскладки, в которых должен работать скрипт?
Цитата: Квас от июля 10, 2012, 19:48
А чтобы узнать код китайской раскладки, можно воспользоваться той же функцией:
так, вроде все получилось, настроил, чтоб скрипт работал только в английской и русской
Цитата: Квас от июля 10, 2012, 19:48
Кстати говоря, с помощью AHK очень удобно переключать раскладки. Я для этого пользуюсь такой функцией:
стоп, но ведь если у меня скрипт будет отключаться в китайской раскладке, я не смогу ее переключить на другую с помощью AHK?
yóó' aninááh

Joris

Цитата: Квас от июля 10, 2012, 19:48
Else
        PostMessage, 0x50,, %Layout%, %C%, A
зачем тут эта строчка?
Цитата: Квас от июля 10, 2012, 19:48
    If (Layout = "English")
    {
        PostMessage, 0x50,, 0x4090409, %C%, A
    }
    Else If (Layout = "Russian")
    {
        PostMessage, 0x50,, 0x4190419, %C%, A
    }
тут не нужны фигурные скобки?
yóó' aninááh

Квас

Цитата: Juuurgen от июля 10, 2012, 20:08
т.е. мне нужно указать те раскладки, в которых должен работать скрипт?

Пардон, имелось в виду Get...() <> код раскладки.

Цитата: Juuurgen от июля 10, 2012, 20:08
стоп, но ведь если у меня скрипт будет отключаться в китайской раскладке, я не смогу ее переключить на другую с помощью AHK?

Ну, это просто офтоп был. В любом случае, #If действует только на то, что под ним. То есть переключалки можно сделать выше.

Цитата: Juuurgen от июля 10, 2012, 20:11
тут не нужны фигурные скобки?

Фигурные скобки можно не ставить, если после If идёт одна строчка.
Пишите письма! :)

Квас

Цитата: Juuurgen от июля 10, 2012, 20:11
ЦитироватьElse
        PostMessage, 0x50,, %Layout%, %C%, A
зачем тут эта строчка?

Строки "English", "Russian" usw. — это просто для своего удобства. А так всегда можно засунуть аргументом стандартный код раскладки типа 0x... — сработает как раз эта строчка функции.
Пишите письма! :)

Joris

Цитата: Квас от июля 10, 2012, 20:18
Пардон, имелось в виду Get...() <> код раскладки.
ща уже ниче не понял
#If GetActiveKeyboardLayout() =
обозначает раскладку, в которой работает скрипт?
как их написать несколько (в частности русский и английский)? если я пишу две такие строчки, то скрипт работает только в последней
yóó' aninááh

Joris

Цитата: Juuurgen от июля 10, 2012, 20:26
если я пишу две такие строчки, то скрипт работает только в последней
хотя стоп, у меня ж не пересекаются они, одно может работать только в русской (там русские символы), другое - только в английской. Так что скопирую одно под одну строчку, другое под другую
yóó' aninááh

Квас

GetActiveKeyboardLayout() — это код раскладки активного окна. Для сравнения можно использовать операторы = (равно) и <> (не равно). То есть можно написать, например,
#If (GetActiveKeyboardLayout() = 0x...) and (GetActiveKeyboardLayout() = 0x...)
или
#If GetActiveKeyboardLayout() <> 0x...
Пишите письма! :)

Joris

Цитата: Квас от июля 10, 2012, 20:30
GetActiveKeyboardLayout() — это код раскладки активного окна. Для сравнения можно использовать операторы = (равно) и <> (не равно).
А, сейчас понял, спасибо.
Но мне проще написать те, в которых должно работать, потому что их только две, а те, в которых не должно — 8 :)

Спасибо большое!
yóó' aninááh

Квас

Пишите письма! :)

Joris

вот это я уже задал
а что мне нужно написать, чтобы при нажатии, допустим, Ctrl+Shift+1 раскладка менялась на английскую
у меня просто стандартные виндовские смены слетают после каждой перезагрузки, а так я бы их в AHK запихнул, а его в автозагрузку и все было бы оккэ :)
yóó' aninááh

Квас

Цитата: Juuurgen от июля 10, 2012, 20:42
а что мне нужно написать, чтобы при нажатии, допустим, Ctrl+Shift+1 раскладка менялась на английскую


^!1::SetLayout("English")


Если вдруг будет глючить с единицей (мало ли какие экзотичные раскладки), можно универсально — сканкодом:
^!sc02::SetLayout("English")
Список сканкодов можно посмотреть, например, здесь:
http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
(Для раскладконезависимости горячих клавиш люди пользуются или сканкодами или виртуальными кодами. Я так и не понял, что из этого идеологически более оправданно, и по инерции пользуюсь сканкодами.)

Пишите письма! :)

Joris

Цитата: Квас от июля 10, 2012, 20:57
^!
:o
это типа Ctrl+Shift
Цитата: Квас от июля 10, 2012, 20:57
sc02
прикольно :)

Цитата: Квас от июля 10, 2012, 20:57
Если вдруг будет глючить с единицей (мало ли какие экзотичные раскладки), можно универсально — сканкодом:
^!sc02::SetLayout("English")
Список сканкодов можно посмотреть, например, здесь:
а вообще, не работает не ^!1 ни ^!sc02
yóó' aninááh

Квас

Опять обманываю. :( ! — это альт, а шифт — +. То есть ^+1.
Пишите письма! :)

arseniiv

Вот моя самопальщина! ;D

SendMode Input
hotstringsEnabled := true

>!\::
  hotstringsEnabled := not hotstringsEnabled
  if hotstringsEnabled {
    SoundPlay, *64
  } else {
    SoundPlay, *-1
  }
return

#Hotstring * ? c z
#If hotstringsEnabled

; всякие символы-пунктуация
::\bullet ::•
::\(c) ::©
::\(r) ::®
::\(tm) ::™
::\tribullet ::‣
::\<< ::«
::\>> ::»
::\0 ::°
::\-- ::—
::\S ::§
::\' ::′
::\'' ::″
::\''' ::‴
::\% ::‰
::\%% ::‱
::\asterism ::⁂
::\space ::␣
::\9< ::,,
::\6> ::"
::\!! ::‼
::\?! ::⁈
::\!? ::⁉
::\.. ::‥
::\... ::...
::\6 ::'
::\9 ::'
::\66 ::"
::\99 ::"
::\big66 ::❝
::\big99 ::❞
::\interrobang ::‽
::\! ::¡
::\? ::¿
::\< ::‹
::\> ::›
::\!! ::‼
::\?? ::⁇
::\c... ::⋯
::\times ::×
::\c. ::⋅

::\[[ ::⟦
::\]] ::⟧
::\le ::⩽
::\ge ::⩾
::\le' ::≤
::\ge' ::≥
::\<- ::←
::\-> ::→
::\upar ::↑
::\dnar ::↓
::\<-> ::↔
::\<= ::⇐
::\=> ::⇒
::\uparr ::⇑
::\dnarr ::⇓
::\<=> ::⇔
::\langle ::⟨
::\rangle ::⟩
::\neg ::¬
::\and ::∧
::\or ::∨
::\circ ::∘
::\lceil ::⌈
::\rceil ::⌉
::\lfloor ::⌊
::\rfloor ::⌋
::\QED ::◼
::\nothing ::∅
::\partial ::∂
::\Nabla ::∇
::\forall ::∀
::\exists ::∃
::\in ::∈
::\notin ::∉
::\in' ::∋
::\minus ::−
::\* ::∗
::\sqrt ::√
::\infty ::∞
::\int ::∫
::\iint ::∬
::\cap ::∩
::\cup ::∪
::\pm ::±
::\mapsto ::↦
::\approx ::≈
::\congruent ::≅
::\!= ::≠
::\=== ::≡
::\parallel ::∥
::\!parallel ::∦
::\perpend ::⊥
::\oplus ::⊕
::\otimes ::⊗
::\subset ::⊂
::\supset ::⊃
::\subset= ::⊆
::\supset= ::⊇
::\subset!= ::⊊
::\!subset= ::⊈
::\sqrt3 ::∛
::\|= ::⊧
::\|- ::⊦

::\venus ::♀
::\mars ::♂

; буквы

::\I ::İ
::\i ::ı
::\Mho ::℧
::\S, ::Ş
::\s, ::ş
::\Z, ::Ȥ
::\z, ::ȥ
::\AE ::Æ
::\ae ::æ
::\O/ ::Ø
::\o/ ::ø

; комбинирующееся
; á
::\acu ::́
; a̋
::\acc ::̋
; â
::\cir ::̂
; ǎ
::\car ::̌
; ā
::\mac ::̄
; ã
::\til ::̃
; ă
::\bre ::̆
; ȧ
::\doo ::̇
; ạ
::\do' ::̣
; ä
::\ddo ::̈
; a̤
::\dd' ::̤
; å
::\rin ::̊
; ḁ
::\ri' ::̥
; a̲
::\und ::̲
; a̶  (зачёркивание)
::\str ::̶
; à
::\gra ::̀
; ȃ
::\ibr ::̑
; a̗
::\ac' ::̗
; a̖
::\gr' ::̖
; a̭
::\ci' ::̭
; a̬
::\ca' ::̬
; a̰
::\ti' ::̰
; a̱
::\ma' ::̱
; a̮
::\br' ::̮
; a̯
::\ib' ::̯
; ą
::\ogo ::̨
; a̽
::\cro ::̽
; a͓
::\cr' ::͓

; буквы
::\И ::І
::\и ::і
::\Йи ::Ї
::\йи ::ї
::\Й ::Ј
::\й ::ј
::\Ль ::Љ
::\ль ::љ
::\Нь ::Њ
::\нь ::њ
::\Е ::Є
::\е ::є
::\У ::Ў
::\у ::ў

; гречица
::\Alpha ::Α
::\Beta ::Β
::\Gamma ::Γ
::\Delta ::Δ
::\Epsilon ::Ε
::\Zeta ::Ζ
::\Eta ::Η
::\Theta ::Θ
::\Iota ::Ι
::\Kappa ::Κ
::\Lambda ::Λ
::\Mu ::Μ
::\Nu ::Ν
::\Xi ::Ξ
::\Omicron ::Ο
::\Pi ::Π
::\Rho ::Ρ
::\Sigma ::Σ
::\Tau ::Τ
::\Ypsilon ::Υ
::\Phi ::Φ
::\Chi ::Χ
::\Psi ::Ψ
::\Omega ::Ω
::\alpha ::α
::\beta ::β
::\gamma ::γ
::\delta ::δ
::\epsilon ::ε
::\zeta ::ζ
::\eta ::η
::\theta ::θ
::\iota ::ι
::\kappa ::κ
::\lambda ::λ
::\mu ::μ
::\nu ::ν
::\xi ::ξ
::\omicron ::ο
::\pi ::π
::\rho ::ρ
::\sigma ::σ
::\tau ::τ
::\ypsilon ::υ
::\phi ::ϕ
::\chi ::χ
::\psi ::ψ
::\omega ::ω
::\varbeta ::ϐ
::\varpi ::ϖ
::\varrho ::ϱ
::\varsigma ::ς
::\vartheta ::ϑ
::\varphi ::φ
::\varkappa ::ϰ

::\aleph ::ℵ
::\^0 ::⁰
::\^1 ::¹
::\^2 ::²
::\^3 ::³
::\^4 ::⁴
::\^5 ::⁵
::\^6 ::⁶
::\^7 ::⁷
::\^8 ::⁸
::\^9 ::⁹
::\^+ ::⁺
::\^- ::⁻
::\^( ::⁽
::\^) ::⁾
::\_0 ::₀
::\_1 ::₁
::\_2 ::₂
::\_3 ::₃
::\_4 ::₄
::\_5 ::₅
::\_6 ::₆
::\_7 ::₇
::\_8 ::₈
::\_9 ::₉
::\_+ ::₊
::\_- ::₋
::\_( ::₍
::\_) ::₎

#If

Joris

Цитата: Квас от июля 10, 2012, 21:49
Опять обманываю. :( ! — это альт, а шифт — +. То есть ^+1.
感谢!
:)
теперь все работает
yóó' aninááh

mnashe

Цитата: arseniiv от июля 10, 2012, 22:52
::\' ::′
::\'' ::″
::\''' ::‴
Вот поэтому постфикс лучше префикса.
У меня на один символ (пробел) короче:
::'~::′
::'~ ::″
::'''~::‴
Нажатий, впрочем, столько же, поскольку '~' со Shift'ом. Но можно и без Shift'а постфикс использовать.
Адепт единственного числа и безродового склонения
שָׁלוֹם עֲלֵיכֶם!

Joris

Цитата: mnashe от июля 11, 2012, 09:01
Цитировать::\' ::′
::\'' ::″
::\''' ::‴
Вот поэтому постфикс лучше префикса.
дык такое ж работать не будет, нэ?
yóó' aninááh

Joris

yóó' aninááh

arseniiv

Будет-будет. Там есть разные режимы обработчика, к тому же. Он может и в 1111 для 11 три раза срабатывать, и прочее. ;D

Joris

у меня просто так расписано:
:C1?0:ща ::сейчас{Space}
:C1?0:ща.::сейчас.
:C1?0:ща!::сейчас{!}
:C1?0:ща?::сейчас?
:C1?0:ща)::сейчас)
:C1?0:щас::сейчас
yóó' aninááh

arseniiv

Есть режим воспринимать разделители как конец заменяемой строчки. Только какие именно разделители — не помню. Хотя ваши, вероятно, подойдут все (general punctuation же).

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр