Autohotkey - 键盘输入仅限一个程序

Autohotkey - 键盘输入仅限一个程序

我正在尝试使用鼠标阅读和滚动浏览 Adob​​e Reader,但当我开始输入时,我希望它转到我的 OneNote 以便在阅读时做笔记。我可以通过软件本身将 OneNote 设置为始终位于最前面,因此将其设置为活动窗口不是强制性要求,但当我将其始终位于最前面时,它也会起作用。不过,如果我可以保留我正在使用的其他窗口为活动窗口,而键盘输入转到 OneNote,那就太好了。

我尝试了几种不同的方法,但我绝对不是专家并且遗漏了一些东西。

尝试 1(这个问题是,我按下的第一个键是在打开的窗口中注册的,这对我的阅读器造成了严重破坏 - 而不是转到 OneNote):

#InstallKeybdHook
SetTimer, AnyKeyPressed, 100

AnyKeyPressed:
    if( A_TimeIdlePhysical < 100 ){
    WinActivate, ahk_exe ONENOTE.EXE
    }

第二次尝试(这可以启动 OneNote 并且不在打开的窗口中注册密钥,但我实际上无法在 OneNote 中输入任何内容):

#Persistent
SetTimer, AnyKeyPressed, 100

AnyKeyPressed:
 #IfWinActive ahk_exe ONENOTE.EXE
 {
    SendInput % "{sc" Format("{:03X}", sc) "}"
 }

#IfWinNotActive ahk_exe ONENOTE.EXE
{
    AnyEndKeys =
    ( LTrim Join
       {LWin}{RWin}{AppsKey}
       {LShift}{RShift}{LControl}{RControl}{LAlt}{RAlt}
       {F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}
       {Left}{Right}{Up}{Down}
       {Insert}{Delete}{Home}{End}{PgUp}{PgDn}
       {Space}{Tab}{Enter}{Escape}{Backspace}
       {CapsLock}{NumLock}{ScrollLock}
       {PrintScreen}{Pause}
       {Numpad0}{Numpad1}{Numpad2}{Numpad3}{Numpad4}
       {Numpad5}{Numpad6}{Numpad7}{Numpad8}{Numpad9}
       {NumpadIns}{NumpadEnd}{NumpadDown}{NumpadPgDn}{NumpadLeft}
       {NumpadClear}{NumpadRight}{NumpadHome}{NumpadUp}{NumpadPgUp}
       {NumpadDot}{NumpadDel}
       {NumpadDiv}{NumpadMult}{NumpadSub}{NumpadAdd}{NumpadEnter}
    )

    Input AnyKey, L1, %AnyEndKeys%
    WinActivate, ahk_exe ONENOTE.EXE
}

第三次尝试(这个方法很好用,但我无法让 Esc 键正常工作 - 例如,我无法使用退格键。另外,当我按下回车键时,它会将新行放在顶部而不是光标停留的位置):

#InstallKeybdHook
Loop {
    Input,anykey,L1,{LControl}{RControl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{Ins}{BS}{Capslock}{Numlock}{PrintScreen}{Pause}
    ControlSend, OneNote::DocumentCanvas1, %anykey%, ahk_exe ONENOTE.EXE
}

我知道将这些结合起来可能有一个解决方案,或者我只需要添加一些简单的东西,但是我的大脑因为学校和新生儿而疲惫不堪,我只想能够在阅读时写笔记,而不必不断地来回切换窗口。

非常感谢您的帮助,我不能再浪费时间了!

答案1

以下是您的代码和 user3419297 的代码的组合。

我不知道 OneNote 为何行为不当,无法按预期将“光标”保留在末尾。您可以通过发送 {End} 稍微解决这个问题,但除非您只想要运行日志,否则您无法真正正确编辑。

捕获所有击键并将它们发送到另一个窗口并不理想,因为您发现...我不确定您处理 Acrobat 的导航方法到底是什么,但我肯定会想以相反的方式执行此操作。

换句话说,我怀疑我是否会在 Acrobat 中导航时尝试将所有击键发送到 OneNote...相反,我会在 OneNote 中进行所有编辑,同时将某些击键/鼠标点击等发送到 Acrobat 以便导航 pdf - 如果您与 Acrobat 的导航交互有限,那么这似乎会容易得多。

测试代码

Loop {
    If thisID:=WinActive(myWinTitle:="ahk_exe Acrobat.exe") {
        
        keys = *1,*2,*3,*4,*5,*6,*7,*8,*9,*0,*a,*b,*c,*d,*e,*f,*g,*h,*i,*j,*k,*l,*m,*n,*o,*p,*q,*r,*s,*t,*u,*v,*w,*x,*y,*z,*Space,*Enter,*Tab,*Backspace,*Delete,*End,*Home,*Right,*Left,*PgUp,*PgDn ; ...
        Loop,Parse,keys, `,
            Hotkey, %A_LoopField%, Label, On
        
        Tooltip, Active
        Sleep 2000
        Tooltip
        
        While WinActive("ahk_id" thisID) ; wait for user to navigate away
            Sleep 200
        
        Loop,Parse,keys, `,
            Hotkey, %A_LoopField%, Label, Off
        
        ; delay is just for visibility, remove tooltips for operation
        Tooltip, Inactive   
        Sleep 2000              
        Tooltip
        
    }
}


Label:
    key := A_ThisHotkey
    
    If (SubStr(key, 1,1)="*")
        key := SubStr(key, 2) ; get rid of "*" if present
    
    If (StrLen(key)>1)  ; encapsulate all special chars
        key:="{" SubStr(key, 1) "}"
    
    ; send raw and let keyboard modifiers that are already down modify the keys being sent
    ControlSend, OneNote::DocumentCanvas1, % key , ahk_exe ONENOTE.EXE
    
    ; OneNote misbehaves
    ControlSend, OneNote::DocumentCanvas1, {End}, ahk_exe ONENOTE.EXE
    
    ToolTip % A_ThisHotkey "-->" key        ; debug only
    
Return

相关内容