2010-01-14 19 views
25

Me gustaría saber cualquier tipo de API o solución alternativa (por ejemplo, secuencia de comandos o registro) para mover (o cambiar el tamaño) de la barra de tareas de Windows a otra posición, incluido otro monitor (si monitores duales). Definitivamente, podemos mover la barra de tareas usando el mouse, pero quiero moverlo por un programa, o de una manera automática.¿Cómo mover la barra de tareas de Windows mediante programación?

Intenté encontrar la API de Win32, pero parece que nadie hace este trabajo.

EDIT: Me sorprendió la opinión de muchas personas. Déjame explicar por qué lo quería. En mi lugar de trabajo, estoy usando monitores duales (las resoluciones son diferentes), y la barra de tareas se coloca en el monitor izquierdo mientras que el monitor principal es el monitor correcto. Sin embargo, a menudo me conecto a la computadora de mi lugar de trabajo a través del escritorio remoto. Después de la conexión remota, la posición de la barra de tareas cambia. Es por eso que quería hacer un programa simple que puede guardar/restaurar la posición de la barra de tareas. Todos los días tengo que reorganizar mi barra de tareas. Eso es. Solo lo quiero para me.

+2

¿Por qué el voto a favor? Es una pregunta perfectamente formulada. En cuanto a la intención dudosa, he visto que se ha respondido mucho peor aquí ... – Thomas

+0

Bueno, Thomas, se podría argumentar que la pregunta no es útil ya que no es una tarea que los programas deberían estar haciendo. Sin embargo, no sabemos realmente la intención del programa de Minjang, así que todos demos el beneficio de la duda, ¿o sí? –

+8

"No es una tarea que los programas deberían estar haciendo" - ¿En serio? ¿Cómo llegas a esa conclusión Rob? Si alguna vez trabajó en un entorno de monitores múltiples, sabría que este tipo de aplicaciones (como UltraMon - http://www.realtimesoft.com/ultramon/) son casi esenciales. ¿Quién te nombró Dios de qué programas deberían estar haciendo? Esta es una pregunta perfectamente buena; +1 de mi parte – Gerard

Respuesta

3

Por lo que yo puedo decir, Vista y en adelante ignoran cualquier programa que intenta mover la barra de tareas. El antiguo método era ABM_SETPOS + MoveWindow, y esto ya no funciona en la barra de tareas. La única manera de la que soy consciente es que sigue funcionando simulando un movimiento de mouse (click-move-release). He leído sobre ese método, pero nunca lo hice yo mismo.

6

La barra de tareas es una ventana. Use SetWindowPos() para moverlo. Consulte también SHAppBarMessage() y ABM_WINDOWPOSCHANGED.

Aunque la barra de tareas puede ser especial y a Windows puede no gustarle que la mueva. Hay muchos casos especiales en la implementación de API de la barra de aplicaciones de Shell para la barra de tareas.

Para pasar a otro monitor, use EnumDisplayMonitors() con GetMonitorInfo(). Algunos monitores pueden tener coordenadas negativas.

+1

Esta es una idea horrible. Por favor, no hagas eso a tus clientes. –

+7

Hasta que OP nos dice por qué quiere hacerlo, no lo sabemos. Hay dos cosas a considerar: ¿es posible y es una buena idea? Solo estamos aquí para considerar lo primero y no lo posterior. Aunque estoy de acuerdo en general con que no es bueno mover la barra de tareas de los usuarios, también puedo ver al menos dos casos válidos para moverla a petición de los usuarios. Como no lo sabemos, intentemos no juzgar demasiado. –

+0

@jeffamaphone: estamos aquí porque elegimos estar aquí. ¿Quién eres tú para decir que solo estamos aquí por una y no por la otra? –

0

SHAppBarMessage (ABM_SETPOS, ...)

+1

'ABM_GETTASKBARPOS' recupera la posición de la barra de tareas. Pero, ABM_SETPOS no está funcionando bien. Obtuve el hWnd de la barra de tareas buscando "Shell_TrayWnd". (Estoy usando Windows 7) Pero, no tuve suerte. MoveWindow/SetWindowPos y cualquier otro ABM_ * no funcionan. Pero gracias. – minjang

4

He tenido algo de suerte con esta tarea en una secuencia de comandos de AutoHotkey, en caso de que no te importe el lenguaje utilizado. Utiliza las pulsaciones de teclas simuladas y los movimientos del mouse para mover la barra de tareas. Me detuve para desbloquear/bloquear la barra de tareas automáticamente.

Lo difícil fue conseguir que funcione de manera confiable. Gran parte del código está dedicado a garantizar que la barra de tareas se mueva. Todavía no funciona al 100% ... falla como el 10% del tiempo por lo que he visto. Sin embargo, ¡debería ser lo suficientemente bueno para comenzar!

Si alguna vez vuelvo a este script para que funcione perfectamente, volveré a publicar aquí.

Aquí está el script de ejemplo (el resaltado es un poco extraño aquí, ya que el lenguaje es AHK):

F3:: 
    reload 
return 

F5:: 
    MoveTaskbar(2,"bottom") 
return 

F6:: 
    MoveTaskbar(2,"left") 
return 

F7:: 
    MoveTaskbar(1,"top") 
return 

; Move the taskbar 
; dspNumber: number. device number (primary display is 1, secondary display is 2...) 
; edge:   string. Top, Right, Bottom, or Left 
MoveTaskbar(dspNumber, edge) 
{ 
    Critical 
    OutputDebug MoveTaskbar - called to move taskbar to display #%dspNumber% ("%edge%" edge) 

    ; absolute coordinate system 
    CoordMode, Mouse, Screen 

    ; error checking for dspNumber 
    SysGet, numMonitors, MonitorCount 
    if (numMonitors<dspNumber) 
    { 
     OutputDebug MoveTaskbar - [ERROR] target monitor does not exist (dspNumber = "%dspNumber%") 
     return 
    } 

    ; get screen position for target monitor 
    SysGet, target, Monitor, %dspNumber% 

    oX := 7 
    oY := 7 

    ; get coordinates for where to move the taskbar 
    if (edge = "Top") 
    { 
     oX := (targetRight-targetLeft)/2 
     trgX := oX+targetLeft 
     trgY := targetTop+15 
    } 
    else if (edge = "Right") 
    { 
     oY := -(targetBottom-targetTop)/2 
     trgX := targetRight-15 
     trgY := -oY + targetTop 
    } 
    else if (edge = "Bottom") 
    { 
     oX := -(targetRight-targetLeft)/2 
     trgX := -oX+targetLeft 
     trgY := targetBottom-15 
    } 
    else if (edge = "Left") 
    { 
     oY := (targetBottom-targetTop)/2 
     trgX := targetLeft+15 
     trgY := oY+targetTop 
    } 
    else 
    { 
     OutputDebug MoveTaskbar - [ERROR] target edge was improperly specified (edge = "%edge%") 
     return 
    } 
    trgX := round(trgX) 
    trgY := round(trgY) 
    oX := round(oX) 
    oY := round(oY) 

    OutputDebug MoveTaskbar - target location is (%trgX%,%trgY%) 
    MouseGetPos, startX, startY 
    OutputDebug MoveTaskbar - mouse is currently at (%startX%,%startY%) 

    ; request the move mode (via context menu) 
    SendInput #b 
    SendInput !+{Space} 
    SendInput m 

    ; wait for the move mode to be ready 
    Loop 
    { 
     if A_Cursor = SizeAll 
      break 
    } 
    OutputDebug MoveTaskbar - move mode is ready 

    ; start the move mode 
    SendInput {Right} 

    ; wait for the move mode to become active for mouse control 
    Loop 
    { 
     if A_Cursor = Arrow 
      break 
    } 
    OutputDebug MoveTaskbar - move mode is active for mouse control 

    ; move taskbar (and making sure it actually does move) 
    offset := 7 
    count := 0 
    Loop 
    { 
     ; move the taskbar to the desired location 
     OutputDebug MoveTaskbar - attempting to move mouse to (%trgX%,%trgY%) 
     MouseMove, %trgX%, %trgY%, 0 
     MouseGetPos, mX, mY, win_id 
     WinGetClass, win_class, ahk_id %win_id% 

     count += 1 

     ; if the mouse didn't get where it was supposed to, try again 
     If ((mX != trgX) or (mY != trgY)) 
     { 
      OutputDebug MoveTaskbar - mouse didn't get to its destination (currently at (%mX%,%mY%)). Trying the move again... 
      continue 
     } 

     ; if the taskbar hasn't followed yet, wiggle the mouse! 
     if (win_class != "Shell_TrayWnd") 
     { 
      OutputDebug MoveTaskbar - window with class "%win_class%" is under the mouse... wiggling the mouse until the taskbar gets over here 

      ;offset := - offset 
      trgX -= round(oX/2) 
      trgY -= round(oY/2) 
      oX := -oX 
      oY := -oY 
      if count = 50 
      { 
       OutputDebug, MoveTaskbar - wiggling isn't working, so I'm giving up. 
       return 
      } 
     } 
     else 
      break 
    } 

    OutputDebug MoveTaskbar - taskbar successfully moved 
    SendInput {Enter} 
} 
7

También tengo esta necesidad en Windows 7. Aquí está mi toma de hacer este script usando autohotkey :

; This script will try to drag and move the taskbar to where the *current* mouse 
; cursor is 

; 0x111: WM_COMMAND, 424: lock/unlock taskbar, http://www.codeproject.com/KB/miscctrl/Taskbar_Manipulation.aspx 
RegRead, TaskbarLocked, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced, TaskbarSizeMove 
If TaskbarLocked = 0 
    SendMessage 0x111, 424, , , ahk_class Shell_TrayWnd 

WinActivate ahk_class Shell_TrayWnd 
MouseGetPos targetX, targetY 
ControlGetPos x, y, w, h, MSTaskListWClass1, ahk_class Shell_TrayWnd 
MouseMove x+1, y+1 
MouseClickDrag Left, x+1, y+1, targetX, targetY, 10 

; often after dragging the taskbar to left or right side of a monitor, even though 
; there are enough room to show two columns of icons, it will only show one column, 
; it seems showing or hiding an icon will fix this 
Menu, Tray, NoIcon 
Menu, Tray, Icon 

; lock the taskbar if it was previously locked 
If TaskbarLocked = 0 
    SendMessage 0x111, 424, , , ahk_class Shell_TrayWnd 

He probado esto en Windows 7 con el tema clásico de la ventana. Para usar esto, asigne una tecla de acceso directo para llamar a esta secuencia de comandos, luego coloque el cursor del mouse en el lugar donde desea arrastrar la barra de tareas y luego presione la tecla de acceso directo.

+0

funciona a la perfección! ¡gracias! (Tuve que ajustar las coordenadas exactas a x + 10, y-35 para mi resolución y tema) – staafl

+0

Exactamente lo que necesitaba, esto me estaba volviendo loco. ¡Gracias! Nota: tuve que usar las variables w y h para definir desplazamientos separados para diferentes posiciones de inicio de la barra de tareas. –

+0

Funciona en Windows 10. Lo he modificado ligeramente para hacer que la barra de tareas siempre tenga el mismo tamaño y la he agregado al programador para que se ejecute en el desbloqueo de la estación de trabajo. –

Cuestiones relacionadas