【问题标题】:Up/Down Key not working in Onenote 2016 for Autohotkey向上/向下键在 Onenote 2016 for Autohotkey 中不起作用
【发布时间】:2017-10-25 12:15:23
【问题描述】:

我使用 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


    【解决方案1】:

    如果您使用 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 文件,然后从其上下文菜单中选择 Run with UI Access(这确实可以解决问题)

    疑难解答:

    • AHK 文件的上下文菜单中缺少 Run with UI Access

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

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

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

    • SendPlay还是不行?

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

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

    【讨论】:

    • 您好,感谢您的帮助!这种重新映射将在段落之间跳转,我想在行之间跳转......
    • @Jason – 最后,我解决了整个问题。现在它按照您的预期在两行之间跳转。请参阅编辑后的答案。现在 Alt+I 和 Alt+K 充当上下箭头。
    • 太棒了!这个问题困扰了我很久,你是我的英雄!
    【解决方案2】:

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

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

    模拟向上键但不完全。

    【讨论】:

    • 感谢您的帮助,我会检查您的脚本!
    【解决方案3】:

    似乎很多人在使用 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 交互方面似乎没有任何问题。请问你用的是什么电脑?

    希望对你有帮助!

    【讨论】:

    • @Jason 有帮助吗?
    • 嗯...“我不知道 AHK 不使用某些东西的情况,因为它是在程序启动之前启动的”——这正是我所说的,并建议 OP 做.. .
    • 我的 AHK 一直在运行,使用 onenote 看不出任何差异。我有一个surface pro 4,那个表面上的bug是一样的......
    • 哦,好吧...抱歉无法提供帮助
    • @ShawnLi 和 Jason:也许你们都是对的。 OneNote 2016 是桌面应用程序,而 OneNote 是 Metro 版本。它们与 AHK 不同,行为也不同。
    【解决方案4】:

    我的解决方案:

    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}
    

    【讨论】:

      【解决方案5】:

      最简单的方法。

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

      在 ahk 论坛 here (original)here (citing original I think) 上找到。经验证可在 Windows 10 1803 和 OneNote 2016(桌面版)上运行。

      【讨论】:

      • 这不会将光标向上移动一行,而是将容器的焦点移到它上面的那个
      【解决方案6】:
      #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

      【讨论】:

        【解决方案7】:

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

        @guest 建议使用dllcall("keybd_event"...) 说明了方法,但不必要地发送了 Shift+Up.,并且不支持修改您映射为向上/向下的键,以便您可以执行诸如按 shift + your- 之类的操作扩展选择的假键。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多