teclado tareas poner mover inicio girar funciona escritorio elementos con como barra acomodar abajo c++ windows winapi

c++ - poner - ¿Cómo mover de forma programática la barra de tareas de Windows?



como poner la barra de tareas abajo (5)

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.

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

EDITAR : 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 .


He tenido algo de suerte con esta tarea en un script de AutoHotkey, por si acaso no te importa 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.

La parte difícil fue lograr que funcionara 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 vuelvo a este guión 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 idioma 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} }


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

Aunque la barra de tareas puede ser especial y a Windows puede no gustarle que se 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.


Por lo que puedo decir, Vista y demás ignoran cualquier programa que intente 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.


SHAppBarMessage (ABM_SETPOS, ...)


También tengo esta necesidad en Windows 7. Aquí está mi opinión para hacer esto usando el script 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.