Подтвердить что ты не робот

Как программно перемещать панель задач Windows?

Я хотел бы узнать какой-либо API или обходной путь (например, script или реестр) для перемещения (или изменения размера) панели задач Windows в другую позицию, включая другой монитор (если используются два монитора). Определенно, мы можем перемещать панель задач с помощью мыши, но я хочу переместить ее с помощью программы или своего рода автоматизированного способа.

Я пытался найти Win32 API, но, похоже, никто не делает эту работу.

EDIT: меня удивило мнение многих людей. Позвольте мне объяснить, почему я этого хотел. На моем рабочем месте я использую двойные мониторы (разрешения разные), а панель задач помещается на левый монитор, а основной монитор - правильный монитор. Тем не менее, я часто подключаюсь к компьютеру на рабочем месте через удаленный рабочий стол. После удаленного соединения позиция панели задач переключается. Вот почему я хотел создать простую программу, которая может сохранять/восстанавливать позицию панели задач. Каждый день мне приходится перестраивать панель задач. Это. Я просто хочу его для me.

4b9b3361

Ответ 1

Насколько я могу судить, Vista и далее игнорируют любую программу, пытающуюся переместить панель задач. Старый метод был ABM_SETPOS + MoveWindow, и это больше не работает на панели задач. Единственный способ, которым я знаю, что все еще работает, - имитировать движение мыши (click-move-release). Я читал об этом методе, но я никогда не делал этого сам.

Ответ 2

У меня также есть эта необходимость в Windows 7. Вот моя попытка сделать это с помощью autohotkey script:

; 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   

Я тестировал это на Windows 7 с классической темой окна. Чтобы использовать это, назначьте горячую клавишу для вызова этого script, затем поместите курсор мыши туда, куда вы хотите перетащить панель задач, затем нажмите горячую клавишу.

Ответ 3

Панель задач - это окно. Используйте SetWindowPos(), чтобы переместить его. См. Также SHAppBarMessage() и ABM_WINDOWPOSCHANGED.

Хотя панель задач может быть специальной, и Windows может не понравиться, что вы ее перемещаете. Существует множество особых случаев в реализации API панели приложений Shell для панели задач.

Чтобы перейти на другой монитор, используйте EnumDisplayMonitors() с GetMonitorInfo ( ). Некоторые мониторы могут иметь отрицательные координаты.

Ответ 4

Мне повезло с этой задачей в AutoHotkey script, на всякий случай, если вам не нужен язык. Он использует симулированные нажатия клавиш и движения мыши для перемещения панели задач. Я прекратил автоматическую разблокировку/блокировку панели задач.

Жесткая часть заставила его работать надежно. Большая часть кода предназначена для обеспечения того, чтобы панель задач перемещалась. Он по-прежнему не работает на 100%... это не так, как в 10% случаев из того, что я видел. Однако, это должно быть достаточно хорошо, чтобы вы начали!

Если я когда-нибудь вернусь к этому script, чтобы он работал отлично, я отправлю его здесь.

Вот пример script (выделение здесь немного нечетное, так как язык 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}
}

Ответ 5

SHAppBarMessage (ABM_SETPOS,...)