@miroxlav's accepted answer works for me, but I am unhappy with the security implications.
@guest's suggestion to use dllcall("keybd_event"...)
showed the way, but unnecessarily sent Shift+Up., and did not support modifying the keys you are mapping to up/down, so that you can do things like pressing shift + your-fake-up key to extend the selection.
Leading to the code below - basically only sending the virtual keycodes vk_up and vk_down up/down, but matching any modifiers using *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 )
}