Up / Down键无法在Onenote 2016中用于Autohotkey

时间:2017-05-25 00:27:40

标签: autohotkey onenote

我使用Autohotkey将alt + i / k映射到上/下键,使用以下代码:

!i:: Send {up}
!k:: Send {down}

这些重映射适用于除2016年Onenote之外的所有应用程序。我在线查看并在以下链接中找到了一些讨论:

https://autohotkey.com/board/topic/15307-up-and-down-hotkeys-not-working-for-onenote-2007/

https://autohotkey.com/board/topic/41454-remap-key-doesnt-work-in-ms-onenote/

他们建议使用sendplay或sendraw,但这些对我没有用。任何人都可以帮我这个吗?

7 个答案:

答案 0 :(得分:5)

如果您使用SendPlay并使用UI Access

运行AHK脚本,则它可以正常工作

这是您的Send更改为SendPlay的脚本:

!i::SendPlay {up}
!k::SendPlay {down}

它按照您的预期模拟。在Windows 10上使用OneNote 2016进行测试。

如何启用SendPlay(最初在Windows 10中无效)

  1. 将上述映射保存到AHK文件中。我只使用这两行文件updown.ahk

  2. 右键单击上面的AHK文件,然后从其上下文菜单中选择使用UI Access运行(这实际上可以解决问题)

  3. <强>故障排除:

    • AHK文件的上下文菜单中缺少使用UI访问

      1. 确保使用安装程序将AutoHotKey安装到Program Files目录中。 AutoHotKey文档说UIA仅在文件位于受信任位置(即Program Files子目录)时才有效。

      2. 在安装程序选项中,请务必检查最后一项,如下所示。
        enter image description here

      3. 提示:如果您的AutoHotKey已经安装,只需重新运行安装程序(在AutoHotKey可执行文件的位置找到Installer.ahk)并检查该选项即可。 (无需卸载并重新安装。)

      4. SendPlay仍无效?

        1. 请参阅在线或本地AHK帮助文件中提供的常见问题解答主题How do I work around problems caused by User Account Control (UAC)。 (它们是相同的。)

        2. 同样描述限制的主题是Run with UI Access(可在线或在本地帮助中获得)。

答案 1 :(得分:3)

似乎Autohotkey在OneNote上存在问题。 做了一些试验和错误我发现:

Send {CTRL DOWN}{UP}{CTRL UP}

模拟向上键但不完全。

答案 2 :(得分:2)

似乎很多人都遇到过OneNote的问题。

https://autohotkey.com/boards/viewtopic.php?f=5&t=25925

https://autohotkey.com/board/topic/49216-interference-between-microsoft-onenote-and-autohotkey/

但是,有些人建议在运行Onenote之前打开AHK 可以解决此问题。对于AHK与Onenote交互,Surface Pro用户似乎没有任何问题。我可以问你用的是什么电脑吗?

希望它有所帮助!

答案 3 :(得分:2)

我的解决方案:

if (winactive("ahk_exe onenote.exe"))
{
    vk_code = 0xA0
    dllcall("keybd_event","UChar", vk_code, "UChar", 0, "UInt", 0, "Ptr", 0 )
    vk_code = 0x26
    dllcall("keybd_event","UChar", vk_code, "UChar", 0, "UInt", 0, "Ptr", 0 )
    vk_code = 0x26
    dllcall("keybd_event","UChar", vk_code, "UChar", 0, "UInt", 0x0002, "Ptr", 0 )
    vk_code = 0xA0
    dllcall("keybd_event","UChar", vk_code, "UChar", 0, "UInt", 0x0002, "Ptr", 0 )
}
else
    send  {blind}{up}

答案 4 :(得分:1)

最简单的方法。

!i::ControlSend, OneNote::DocumentCanvas1, {Up}, ahk_exe ONENOTE.EXE

在ahk论坛here (original)here (citing original I think)上找到。验证可在Windows 10 1803和OneNote 2016(台式机版)上正常工作。

答案 5 :(得分:0)

#if WinActive("ahk_exe" "ONENOTE.EXE")
j(){
    run %A_ScriptDir%\sendDown.exe
}
k(){
    run %A_ScriptDir%\sendUp.exe
} 
NumLock & j::j()
return
NumLock & k::k()
return

您可以从 here

下载 exe

答案 6 :(得分:0)

@miroxlav 接受的答案对我有用,但我对安全隐患不满意。

@guest 使用 dllcall("keybd_event"...) 的建议显示了方式,但不必要地发送了 Shift+Up.,并且不支持修改您映射到上/下的键,以便您可以执行诸如按 shift + 之类的操作用于扩展选择的伪造键。

导致下面的代码 - 基本上只发送虚拟键码 vk_up 和 vk_down up/down,但使用 *a::... 匹配任何修饰符

#If GetKeyState("Capslock","T") && alternate_keyboard_layouts == ...
;; map CapsLock + A/S => up/down

*a::work_around_OneNote_problems("up")
*s::work_around_OneNote_problems("down")
;; ^^ uses * - all modifiers - so that can do shift+a to exend selection, etc.

#If

work_around_OneNote_problems(key_str)
{
    local

    if (! winactive("ahk_exe onenote.exe"))
        send  {blind}{%key_str%}

    vk_up := 0x26
    vk_down := 0x28

    if( key_str == "up" )
    {
        send_keybd_event_down(vk_up)
        send_keybd_event_up(vk_up)
    }
    else if( key_str == "down" )
    {
        send_keybd_event_down(vk_down)
        send_keybd_event_up(vk_down)
    }
    else {
        msgbox, work_around_OneNote_problems only for up/down, got: <<%key_str%>>
    }
}

send_keybd_event_down(vk_code)
{
    dllcall("keybd_event","UChar", vk_code, "UChar", 0, "UInt", 0, "Ptr", 0 )
}
send_keybd_event_up(vk_code)
{
    dllcall("keybd_event","UChar", vk_code, "UChar", 0, "UInt", 0x0002, "Ptr", 0 )
}