Desplazarse horizontalmente en Adobe Reader usando AutoHotkey

0

Deseo utilizar AutoHotkey para desplazar un documento horizontalmente en Adobe Reader X. Los mensajes de la rueda de envío (0x20e) no funcionan, ni el envío de mensajes de desplazamiento (0x114). El único método que pude encontrar es enviar clics a las flechas de la barra de desplazamiento, pero eso hace que el desplazamiento horizontal sea muy lento, además de retrasar mucho el desplazamiento vertical concurrente. Además, noto que mi controlador de mouse (UltraNav) puede desplazarse bajo un cuadro de diálogo aparentemente modal en Adobe Reader X, como el cuadro de diálogo Abrir archivo, mientras que ninguno de los tres métodos anteriores puede hacerlo. Entonces, ¿alguien sabe lo que podría estar haciendo mi controlador de mouse o de otra manera?

Acabo de encontrar un cuarto método que funciona bastante bien para la mayoría de las aplicaciones para las cuales fallan los dos primeros, que es enviar teclas de flecha a la barra de desplazamiento. Cuando responde correctamente, también responde a {PgUp} y {PgDn} que se desplaza por página. Sin embargo, todavía no funciona debajo de un diálogo modal, por lo que lo que hace el controlador del mouse sigue siendo un misterio para mí, aunque parece desplazarse en las mismas cantidades. Además, este método no funciona en el Explorador de Windows (se espera); las teclas enviadas a las barras de desplazamiento también se envían al área principal. Por ejemplo, controlsend,%scrollbarname%,{Down},ahk_id %window%se desplazará con éxito la barra de desplazamiento, pero también hará que la posición de selección actual se mueva hacia abajo si es posible. No puedo encontrar ninguna otra forma de controlar la barra de desplazamiento horizontal en el Explorador de Windows sin enviar clics del mouse.

Editar

Vea el desplazamiento automático y la aceleración del clic central y del mouse, que era mi objetivo original, Adobe Reader es solo una de las muchas aplicaciones que no comprende los mensajes habituales de la rueda.

usuario21820
fuente

Respuestas:

1

Adobe Reader tiene una forma extraña de manejar el desplazamiento horizontal. Esto es lo que uso para solucionar el problema:

#IfWinActive, ahk_exe Acrobat.exe
F13::
  While GetKeyState("F13") {
    Send, {Shift down}{WheelUp}
    Sleep, 100
  }
  Send, {Shift up}
  Return

F14::
  While GetKeyState("F14") {
    Send, {Shift down}{WheelDown}
    Sleep, 100
  }
  Send, {Shift up}
  Return
#IfWinActive

Nota: Cambié la asignación de teclas de mi desplazamiento de mouse izquierdo y derecho a teclas F para que pudieran ser recogidas en AutoHotKey ya que también uso Logitech SetPoint

Stephan
fuente
Lo siento, olvidé responder mi propia pregunta después de encontrar una solución completa por mi cuenta unos meses después. Vea mi respuesta para los detalles.
user21820
No tengo suficientes puntos para comentar su respuesta, pero solo quería agradecerle por compartir su solución.
Stephan
Claro que de nada! Si tiene alguna pregunta sobre mi solución o mi script completo sobre la otra pregunta que he creado, no dude en preguntarme. Para notificar a un solo usuario, coloque @<username>en cualquier parte de su comentario.
user21820
0

Puede hacer clic (solo presione el botón izquierdo del mouse, no lo confíe todavía) al comienzo de la barra de desplazamiento, en el lugar donde se encuentra el punto rojo en la imagen a continuación. Después de mover el mouse lo más abajo posible, en el lugar donde está el punto verde en la imagen de abajo. Ahora suelte el botón izquierdo del mouse. La velocidad de desplazamiento debe ser lo suficientemente buena.

ingrese la descripción de la imagen aquí

Aquí está el código completo del script AutoHotkey:

CoordMode, Mouse, Screen
InitX := 
InitY :=
DestX := 
DestY :=
Click, Left, Down, %InitX%, %InitY%
Mousemove, %DestX%, %DestY%, 0
Click, Left, Up

Las variables InitX e InitY deben contener coordenadas (x e y respectivamente) puntos iniciales. Coordenadas del punto rojo que se encuentra en la imagen de arriba.

Las variables DestX y DestY deben contener coordenadas (x e y respectivamente) para los puntos de destino. Coordenadas del punto verde que se encuentra en la imagen de arriba.

EDITADO :

Que eso te pueda ayudar: http://ahkscript.org/boards/viewtopic.php?f=5&t=4028

Descargue la nueva versión de AutoHotkey de http://ahkscript.org/ (versión actual). ¡AutoHotkey de autohotkey.com está desactualizado!

vasili111
fuente
Bueno, no mencioné este método en mi pregunta, pero no es lo que quiero, ya que la velocidad de desplazamiento variaría con el ancho del documento y no sería uniforme para documentos anchos. Y quería un desplazamiento horizontal porque los mensajes de rueda vertical funcionan bien para la mayoría de las aplicaciones.
user21820
Por cierto, estoy usando AutoHotkey_L, que creo (no recuerdo de dónde lo descargué) es de ahkscript.org. =)
user21820
@ user21820 Mi script funcionará con cualquier tipo de barra de desplazamiento (horizontal o vertical o cualquier otra;)) solo dale las coordenadas correctas (inicial y de destino). La velocidad de desplazamiento será lo suficientemente rápida. Si necesitas suavizarlo, puedes jugar con la velocidad del mousemove. Actualmente tiene valor 0. Puede subir a 100(más valor, menos velocidad). Y sí, la velocidad de desplazamiento variará con el ancho del documento. Código actualizado
vasili111
No entiendes Cuando el documento es largo, solo arrastrando la barra de desplazamiento 1 píxel hará que se desplace varias páginas. Eso es absolutamente indeseable, por eso los mensajes de rueda son mejores para el desplazamiento vertical. Para el desplazamiento horizontal, generalmente no es tan malo, pero todavía no quiero que la velocidad de desplazamiento varíe con el ancho del documento. De todos modos, dado que mi cuarto método funciona perfectamente con Adobe Reader, mi única pregunta restante es qué hace exactamente UltraNav. ¡Pero gracias por compartir tu método!
user21820
@ user21820 Al final de mi pregunta, consulte la sección EDITADA . Puede que esto te ayude.
vasili111
0

Respuesta corta

Para el desplazamiento horizontal en Adobe Reader X, envíe mensajes de desplazamiento al padre de la barra de desplazamiento, como sendscrolltoscrollbarparenten el código. Muchas otras formas no funcionarían correctamente. Este método de alguna manera proporciona un desplazamiento muy rápido, incluso mejor que mi controlador de mouse original.

Respuesta larga

Había encontrado mis propias respuestas, pero me había olvidado de esta pregunta. Básicamente, utilicé un método idiosincrásico para todas y cada una de las aplicaciones locas. Como hay demasiados, he creado una pregunta y una respuesta por separado para todo el lote ( desplazamiento de AutoHotkey y aceleración del clic central y del mouse ), y solo proporciono las partes relevantes para Adobe Reader aquí.

El proceso debería ser así. Primero llama gettarget, lo que supone que la posición del mouse está almacenada mx,myy encuentra el objetivo correcto para los eventos de desplazamiento en función de lo que está actualmente debajo del mouse. Luego llama repetidamente scrolldespués de agregar la cantidad a la que desea desplazarse sx,sy.

Para Adobe Reader, incluso el desplazamiento vertical depende del envío de mensajes de rueda al lugar correcto, lo que no es coherente y, por lo tanto, terminé codificando los dos casos principales, que desplazan el área de visualización del documento y el área de marcadores. Para averiguar qué caso es, verifico si el padre del control bajo el mouse tiene un descendiente llamado AVL_AVView4o no. Si lo hace, entonces ese es el correcto para enviar mensajes de rueda vertical, realizado por sendwheel. Pero para el desplazamiento horizontal, resulta que enviar mensajes de desplazamiento al control principal de la barra de desplazamiento correcta funciona en ambos lugares, realizado por sendscrolltoscrollbarparent. La barra de desplazamiento correcta es la que se llama scrollbar1descendiente del padre del control bajo el mouse.

Código

#commentflag // ; Change to C++ comment style

global mx,my
global sx:=0
global sy:=0
global ctrl,window,parent
global methodx
global methody
global scrollbarx
global scrollbary

global max16bit:=32767

gettarget()
{
    ctrl:=getctrlat(mx,my)
    window:=getwindow(ctrl)
    class:=getclass(window)
    parent:=getparent(ctrl)
    parentname:=getnameatroot(parent)
    if( class=="AcrobatSDIWindow" )
    {
        if( regexmatch(parentname,"AVL_AVView")==1 )
        {
            ctrl:=getdescendant(parent,"AVL_AVView4")
            if( ctrl=="" )
            {
                ctrl:=getdescendant(parent,"AVL_AVView1")
            }
            methodx:="scrolltoscrollbarparent"
            scrollbarx:="scrollbar1"
            methody:="wheel"
        }
    }
}

scroll:
    critical on
    tx:=sx
    ty:=sy
    sx-=tx
    sy-=ty
    rx:=0
    ry:=0
    if( tx!=0 )
    {
        txi:=rtoz(tx)
        rx:=tx-txi
        if( txi!=0 )
        {
            if( methodx=="scrolltoscrollbarparent" )
            {
                sendscrolltoscrollbarparent(scrollbarx,"h",txi)
            }
        }
    }
    if( ty!=0 )
    {
        if( methody=="wheel" )
        {
            sendwheel("v",-ty)
        }
    }
    sx:=rx
    sy:=ry
return

sendwheel(dir,amount)
{
    t:=a_tickcount
    msg:=( dir=="v" ? 0x20a : 0x20e )
    flags:=getkeystate("Ctrl")<<3|getkeystate("Shift")<<2
    amount*=120
    while( amount>max16bit )
    {
        sendmessage msg,max16bit<<16|flags,mx|my<<16,,ahk_id %ctrl%,,,,timelimit
        amount-=max16bit
        if( a_tickcount-t>=timelimit )
        {
            return
        }
    }
    while( amount<-max16bit )
    {
        sendmessage msg,-max16bit<<16|flags,mx|my<<16,,ahk_id %ctrl%,,,,timelimit
        amount+=max16bit
        if( a_tickcount-t>=timelimit )
        {
            return
        }
    }
    sendmessage msg,round(amount)<<16|flags,mx|my<<16,,ahk_id %ctrl%,,,,timelimit
}
sendscrolltoscrollbarparent(name,dir,amount)
{
    sb:=getdescendant(parent,name)
    sbp:=getparent(sb)
    t:=a_tickcount
    msg:=( dir=="v" ? 0x115 : 0x114 )
    flag:=( amount<0 ? 0 : 1 )
    loop % abs(amount)
    {
        sendmessage msg,flag,sb,,ahk_id %sbp%,,,,timelimit
        if( a_tickcount-t>=timelimit )
        {
            return
        }
    }
}

rtoz(r)
{
    return ( r>0 ? floor(r) : ceil(r) )
}
getparent(handle)
{
    return dllcall("GetParent","uint",handle)
}
getname(root,handle)
{
    local CH,CN,S,P
    WinGet, CH, ControlListHwnd, ahk_id %root%
    WinGet, CN, ControlList, ahk_id %root%
    setformat integerfast,h
    handle+=0
    handle.=""
    setformat integerfast,d
    LF:= "`n",  CH:= LF CH LF, CN:= LF CN LF,  S:= SubStr( CH, 1, InStr( CH, LF handle LF ) )
    StringReplace, S, S,`n,`n, UseErrorLevel
    StringGetPos, P, CN, `n, L%ErrorLevel%
    Return SubStr( CN, P+2, InStr( CN, LF, 0, P+2 ) -P-2 )
}
getdescendant(handle,name)
{
    local CH,CN,S,P
    WinGet, CH, ControlListHwnd, ahk_id %handle%
    WinGet, CN, ControlList, ahk_id %handle%
    setformat integerfast,h
    handle+=0
    handle.=""
    setformat integerfast,d
    LF:= "`n",  CH:= LF CH LF, CN:= LF CN LF,  S:= SubStr( CN, 1, InStr( CN, LF name LF ) )
    StringReplace, S, S,`n,`n, UseErrorLevel
    StringGetPos, P, CH, `n, L%ErrorLevel%
    Return SubStr( CH, P+2, InStr( CH, LF, 0, P+2 ) -P-2 )*1
}
getnameatroot(handle)
{
    return getname(dllcall("GetAncestor","uint",handle,"uint",2),handle)
}
getnameaschild(handle)
{
    return getname(getparent(handle),handle)
}
getclass(handle)
{
    local class
    wingetclass class,ahk_id %handle%
    return class
}
getwindow(handle)
{
    return dllcall("GetAncestor","uint",handle,"uint",2)
}
getctrlat2(x,y,first,current)
{
    /*
        Pushes the following invisible container controls to the back because they are in front of their contents for no reason
            SysTabControl32 : The usual class that contains tabbed panes ( Mouse properties , ... )
            Static : A class occasionally used to contain tabbed panes ( Programmer's Notepad Options > Fonts and Colours > Advanced , ... )
            Button : A typical class used to contain a List Box ( Outlook Contact > Properties > General > Members , ... )
        Executes WindowFromPoint again to access the contents of such container controls
    */
    local handle,class,style
    class:=getclass(current)
    winget style,style,ahk_id %current%
    if( class=="SysTabControl32" or class=="Static" or ( class=="Button" and (style&0x7)==0x7 ) )
    {
        dllcall("SetWindowPos","uint",current,"uint",1,"int",0,"int",0,"int",0,"int",0,"uint",0x3)  // push it to the back where it belongs
        handle:=dllcall("WindowFromPoint","int",x,"int",y)
        //handle:=DllCall( "WindowFromPoint", "int64", (my << 32) | (mx & 0xFFFFFFFF), "Ptr") // for negative 64-bit
        if( handle==first )
        {
            return first
        }
        return getctrlat2(x,y,first,handle)
    }
    return current
}
getctrlat(x,y)
{
    local handle
    handle:=dllcall("WindowFromPoint","int",x,"int",y)
    //handle:=DllCall( "WindowFromPoint", "int64", (my << 32) | (mx & 0xFFFFFFFF), "Ptr") // for negative 64-bit
    return getctrlat2(x,y,handle,handle)
}
usuario21820
fuente
0

Mi solución:

#IfWinActive, ahk_exe Acrobat.exe
WheelLeft::
    Send,{shift down}
    sleep,20
    Send,{WheelUp}
    sleep,20
    Send,{shift up}
    return
WheelRight::
    Send,{shift down}
    sleep,20
    Send,{WheelDown}
    sleep,20
    Send,{shift up}
    return
#IfWinActive

Puedes aumentar el número 20 para desplazarte más despacio

Feiran Zhang
fuente