【问题标题】:Create custom keyboard layout with AutoHotKey (or something else)使用 AutoHotKey(或其他东西)创建自定义键盘布局
【发布时间】:2015-05-24 14:59:48
【问题描述】:

我正在寻找创建自定义键盘布局,主要用于输入 unicode 数学符号。我需要的符号集非常大,我想出的方案涉及多种布局和特殊组合。

我输入 `(反引号)一次,我得到一个特殊字符,我们将用 * 表示。通过键入其他键,我可以获得与特定主题相关的特定键盘布局。 (我想用一个特殊符号替换反引号,以便我记住它是一种控制代码。通过输入两次,我得到一个正常的反引号)

以下是一些示例映射:

*s -> Set theory layout:
    [ -> ∈ (element of)
    o -> ∅ (empty set)

*r -> General math:
    s -> ∫ (integral sign)
    S -> ∬ (double integral sign)

*e -> Misc operators:
    8 -> ∗ (convolution asterisk)
    * -> ⋆ (star operator)

*g -> Greek alphabet

键入= 之类的字符后,我可以键入一些其他特殊组合来修改该字符。例如:

*x -> Negates the previous character:
    = -> ≠ (unequal)
    ≡ -> ≢ (negation of three line equality)

*w -> Expands the previous character:
    ∫ -> ∭ (triple integral)
    ∬ -> ⨌ (quad integral)

映射是助记符。可以想象,我可以将我想要的所有符号都塞进一个布局中,但这将无法使用,所以我想尝试坚持这个方案或类似的方案。

键盘适用于 Windows 环境,但我自己为它编写键盘 DLL 是毫无疑问的。我研究了一下,它太复杂了。

现在,我正在向 AHK 寻求解决方案。可以在 AHK(或类似的东西)中完成吗?如果是这样,你能给我一些例子让我开始吗?

我也想知道是否有其他方法可以做到这一点。

我知道 Microsoft 键盘布局创建器,并且过去曾使用过它,但它的功能还不够强大。我也知道 Tavultesoft 的 Keyman,而且我知道它可以做我想做的事,但它的价格高得离谱,所以不是一个选择。

【问题讨论】:

  • 为什么要在开头将` 替换为*?你这是什么意思?
  • 好吧,用特殊的 unicode 符号替换 ` 字符以提醒我我正在使用某种控制代码。我不知道我会用什么奇怪的 unicode 符号,所以我只是说*
  • 仅供参考:Keyman 9 和 Keyman Developer 9 有免费版本。

标签: windows unicode keyboard autohotkey


【解决方案1】:

你需要的东西绝对可以用 AutoHotkey 来完成。

棘手的部分是:您需要动态分配热键和Hotstrings。前者可以通过Hotkey-command 实现,后者尚未实现,可能永远不会实现。 您可以将它们写入新的 .ahk 文件并单独执行该脚本,或者使用 polyethene's really awesome dynamical regEx hotstring creator。 autohotkey.net 的存储库已经关闭多年,但我找到了脚本here。 要运行以下示例脚本,您需要将该脚本下载到 Hotstrings.ahk 并将其放在主 .ahk 文件所在的同一目录中。

但是,我无法将布局更改器热键分配给

`

,所以我将它设置为ä

我知道这个网站不是代码提供者网络,但我对这个问题也很感兴趣。

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#include Hotstrings.ahk

lastKey := ""

; KEYS OF THE NORMAL LAYOUT WHICH SHOULD BE NEGATABLE:
hotstrings("=", "_equals")  ;

; CHOOSE LAYOUT OR NEGATE/EXPAND LAST CHARACTER:
:*?:ä::
; backSpacePressed:  ; wtf is this? sorry just saw this now. Does not belong here, does not belong anywhere
    sendRaw *
    tooltip, 
    (
    n   normal layout

    s   set theory
    r   general math

    x   negate previous
    w   expand previous

    {esc}   cancel
    ), %A_CaretX%, %A_CaretY%
    input, layout, L1, {Escape}, s,r,e,g,x,w
    send {Backspace}    ; remove the *
    if layout in n,s,r,e,g,x,w
    {
        tooltip, %layout%, %A_CaretX%, %A_CaretY%

        ; RESET
        if layout = n
        {
            reset_all_hotstrings()

            ; KEYS OF THE NORMAL LAYOUT WHICH SHOULD BE NEGATABLE:
            hotstrings("=", "_equals")
        }



        ; NEW LAYOUT
        else if layout = s
        {
            reset_all_hotstrings()

            ; SET THEORY SHORTCUTS
            hotstrings("o", "_emptySet")
            hotstrings("\[", "_elementOf")
        }
        else if layout = r
        {
            reset_all_hotstrings()

            ; MATH SHORTCUTS
            hotstrings("s", "_integral")
            hotstrings("S", "_doubleIntegral")
            hotstrings("=", "_identical")
        }
        ; and so on
        ; ...



        ; EDIT PREVIOUS CHARACTER
        else if layout = x
        {
            send {backSpace}

            if lastKey = identical
                sendUnicodeChar(0x2262)
            else if lastKey = equals
                sendUnicodeChar(0x2260)
        }
        ; EXPAND PREVIOUS CHARACTER
        else if layout = w
        {
            send {backSpace}

            if lastKey = integral
                sendUnicodeChar(0x222D)
            else if lastKey = doubleIntegral
                sendUnicodeChar(0x2A0C)
        }
    }
    else
    {
        tooltip, cancelled, %A_CaretX%, %A_CaretY%
    }
    sleep, 500
    tooltip
return

reset_all_hotstrings() {
    hotstrings("=")
    hotstrings("\[")
    hotstrings("o")
    hotstrings("s")
    hotstrings("S")
    ; and so on
}

; NORMAL LAYOUT SHORTCUTS:
_equals:
    sendUnicodeChar(0x003D)
    lastKey = equals
return



; SPECIAL LAYOUT SHORTCUTS:
_emptySet:
    ;sendUnicodeChar(0x00D8)
    altNumpad(0216)
        ; to find out numpad combination or unicode: press WIN+R, type in "charmap"
        ; or for unicode only, go to http://www.fileformat.info/info/unicode/category/index.htm
        ; (sendUnicodChar() needs 0x before the unicode string)
    ;altNumpad(0248)
    ;send Ø
    ;send ø
    ;   choose whatever works best for you
    lastKey = emptySet
return

_elementOf:
    sendUnicodeChar(0x2208)
    lastKey = elementOf
return

_integral:
    sendUnicodeChar(0x222B)
    lastKey = integral
return

_identical:
    sendUnicodeChar(0x2261)
    lastKey = identical
return

_doubleIntegral:
    sendUnicodeChar(0x222C)
    lastKey = doubleIntegral
return

; -------------------------------------------

altNumpad(numbers) {
    stringSplit, n, numbers
    setkeydelay, 100
    send {alt down}
    loop, %n0%
    {
        t := n%a_index%
        send {numpad%t%}
    }
    send {alt up}
}


SendUnicodeChar(charCode)
{
    VarSetCapacity(ki, 28 * 2, 0)
    EncodeInteger(&ki + 0, 1)
    EncodeInteger(&ki + 6, charCode)
    EncodeInteger(&ki + 8, 4)
    EncodeInteger(&ki +28, 1)
    EncodeInteger(&ki +34, charCode)
    EncodeInteger(&ki +36, 4|2)

    DllCall("SendInput", "UInt", 2, "UInt", &ki, "Int", 28)
}

EncodeInteger(ref, val)
{
    DllCall("ntdll\RtlFillMemoryUlong", "Uint", ref, "Uint", 4, "Uint", val)
}

^e::reload

显然还有很大的改进空间

【讨论】:

  • 太棒了。你真的很棒。这比我所希望的要多得多。我是 AHK 的新手,所以我需要一段时间才能弄清楚,但谢谢。看起来我的工作已经完成,我要写下我想要的所有符号。如果你有兴趣,你可以找到我目前对布局的想法here。但有些东西并不在那里,比如所有组合变音符号,以及映射mathematical font characters 的延伸目标,尽管这些往往与大多数程序不兼容并且可能无法呈现。
  • 我明白了.. 在您的布局中,您还提到了 Shift。 ctrl,shift,alt,win 是修饰符,afaik 不能在热字符串中使用,只能在热键中使用。无论如何,也许将 hotstings 和 hotstrings.ahk 库放在旁边将是最好的解决方案。如上所述,您将使用Hotkey 命令而不是hotstring("","")。唯一不足:您必须手动发送{backspace},如 [1][this] example [1]autohotkey.com/board/topic/13050-hotstring-containing-modifier god dammit i hat stack cmets
  • 我认为它会根据我输入的字符起作用,例如 S 而不是 s
  • 另外,没有 alt 或控制,只是 shift(基本上是“大写字母”版本)。
  • 被其他的事情牵着鼻子走,所以直到现在才开始敲键盘,今天才写出来。 Here it is,如果你有兴趣。
猜你喜欢
  • 2020-12-23
  • 2011-07-02
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多