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 中什么都不做)
将上述映射保存到 AHK 文件中。我使用的文件 updown.ahk
只有这两行。
右键单击上面的 AHK 文件,然后从其上下文菜单中选择 select 运行 和 UI Access (这实际上起到了作用)
疑难解答:
AHK 文件
的上下文菜单中缺少具有 UI 访问权限 的项目 运行
确保使用安装程序将 AutoHotKey 安装到 Program Files 目录中。 AutoHotKey 文档说 UIA 仅在文件位于受信任的位置(即 Program Files 子目录)时才有效。
在安装程序选项中,务必勾选最后一项,如下所示。
提示:如果您的 AutoHotKey 已经安装,只需重新运行 安装程序就足够了(Installer.ahk
在 AutoHotKey 可执行文件的位置找到) 并检查选项。 (无需卸载重新安装。)
SendPlay
还是不行?
请参阅联机或本地 AHK 帮助文件中的常见问题解答主题 How do I work around problems caused by User Account Control (UAC)。 (他们是一样的。)
描述限制的类似主题是 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 )
}
我使用 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 中什么都不做)
将上述映射保存到 AHK 文件中。我使用的文件
updown.ahk
只有这两行。右键单击上面的 AHK 文件,然后从其上下文菜单中选择 select 运行 和 UI Access (这实际上起到了作用)
疑难解答:
AHK 文件
的上下文菜单中缺少具有 UI 访问权限 的项目 运行确保使用安装程序将 AutoHotKey 安装到 Program Files 目录中。 AutoHotKey 文档说 UIA 仅在文件位于受信任的位置(即 Program Files 子目录)时才有效。
在安装程序选项中,务必勾选最后一项,如下所示。
提示:如果您的 AutoHotKey 已经安装,只需重新运行 安装程序就足够了(
Installer.ahk
在 AutoHotKey 可执行文件的位置找到) 并检查选项。 (无需卸载重新安装。)SendPlay
还是不行?请参阅联机或本地 AHK 帮助文件中的常见问题解答主题 How do I work around problems caused by User Account Control (UAC)。 (他们是一样的。)
描述限制的类似主题是 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 )
}