Up/Down Key 在 Onenote 2016 for Autohotkey 中不起作用

Up/Down Key not working in Onenote 2016 for Autohotkey

我使用 Autohotkey 将 alt+i/k 映射到 Up/down 键,代码如下:

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

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

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,但这些对我不起作用。谁能帮我解决这个问题?

Autohotkey 似乎与 OneNote 有问题。 做一些试验和错误我发现这样做:

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

模拟向上键但不完全。

好像很多人都遇到过 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 可以解决这个问题。 Surface Pro 用户似乎对 AHK 与 Onenote 交互没有任何问题。请问你用的是什么电脑?

希望对您有所帮助!

如果您将 SendPlay 和 运行 AHK 脚本与 UI Access

一起使用,它会起作用

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

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

它模拟了 如你所料。已在 Windows 10.

上使用 OneNote 2016 进行测试

如何启用 SendPlay:(最初在 Windows 10 中什么都不做)

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

  2. 右键单击上面的 AHK 文件,然后从其上下文菜单中选择 select 运行 和 UI Access (这实际上起到了作用)

疑难解答:

  • AHK 文件

    的上下文菜单中缺少具有 UI 访问权限 的项目 运行
    1. 确保使用安装程序将 AutoHotKey 安装到 Program Files 目录中。 AutoHotKey 文档说 UIA 仅在文件位于受信任的位置(即 Program Files 子目录)时才有效。

    2. 在安装程序选项中,务必勾选最后一项,如下所示。

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

  • SendPlay还是不行?

    1. 请参阅联机或本地 AHK 帮助文件中的常见问题解答主题 How do I work around problems caused by User Account Control (UAC)。 (他们是一样的。)

    2. 描述限制的类似主题是 Run with UI Access(在线或本地帮助中可用)。

我的解决方案:

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}

最简单的方法。

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

在 ahk 论坛上找到 here (original) and here (citing original I think)。已验证使用 OneNote 2016(桌面版)处理 Windows 10 1803。

#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

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

@guest的建议使用dllcall("keybd_event"...)指明了方向,但不必要地发送了Shift+Up.,并且不支持修改映射到up/down的键,所以你可以做事比如按 shift + your-fake-up 键来扩展选择。

导致下面的代码 - 基本上只发送虚拟键码 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 )
}