2010-01-14 14 views
25

Ich möchte jede Art von API oder Workaround (z. B. Skript oder Registrierung) zu verschieben (oder Größe ändern) Windows Taskleiste an eine andere Position einschließlich eines anderen Monitors (wenn Dual-Monitore). Natürlich können wir die Taskleiste mit der Maus verschieben, aber ich möchte sie nach einem Programm oder einer Art automatisierten Wegs verschieben.Wie programmgesteuert Windows-Taskleiste verschieben?

Ich habe versucht, Win32-API zu finden, aber es scheint, niemand macht diesen Job.

EDIT: Ich war überrascht von der Meinung vieler Leute. Lass mich erklären, warum ich es wollte. An meinem Arbeitsplatz verwende ich zwei Monitore (die Auflösungen sind unterschiedlich) und die Taskleiste befindet sich auf dem linken Monitor, während der primäre Monitor der richtige Monitor ist. Ich stelle jedoch häufig eine Verbindung zu meinem Arbeitsplatzcomputer über den Remote-Desktop her. Nach der Remote-Verbindung wird die Taskleistenposition umgeschaltet. Deshalb wollte ich ein einfaches Programm erstellen, das die Position der Taskleiste speichern/wiederherstellen kann. Jeden Tag muss ich meine Taskleiste neu anordnen. Das ist es. Ich will es nur für mich.

+2

Warum der Downvote? Es ist eine perfekt formulierte Frage. Was die zweifelhafte Absicht anbelangt, habe ich gesehen, dass viel schlimmer hier geantwortet wird ... – Thomas

+0

Nun, Thomas, das Argument könnte lauten, dass die Frage nicht nützlich ist, da es keine Aufgabe ist, die Programme tun sollten. Allerdings wissen wir nicht genau, was Minjangs Programm vorhat, also lasst uns allen den Zweifel geben, oder? –

+8

"Keine Aufgabe, die Programme machen sollten" - Wirklich? Wie kommst du zu dieser Schlussfolgerung Rob? Wenn Sie jemals in einer Umgebung mit mehreren Monitoren gearbeitet haben, dann wissen Sie, dass diese Art von Anwendungen (wie UltraMon - http://www.realtimesoft.com/ultramon/) fast unverzichtbar sind. Wer hat dich zum Gott von welchen Programmen ernannt? Das ist eine vollkommen gute Frage. +1 von mir. – Gerard

Antwort

3

Soweit ich das beurteilen kann, Vista und weiter alle Programme ignorieren versucht, die Taskleiste zu bewegen. Die alte Methode war ABM_SETPOS + MoveWindow und funktioniert nicht mehr in der Taskleiste. Die einzige Möglichkeit, die mir bekannt ist, besteht darin, eine Mausbewegung (Click-Move-Release) zu simulieren. Ich habe über diese Methode gelesen, aber ich habe es nie selbst gemacht.

6

Die Taskleiste ist ein Fenster. Verwenden Sie SetWindowPos(), um es zu verschieben. Siehe auch SHAppBarMessage() und ABM_WINDOWPOSCHANGED.

Obwohl die Taskleiste möglicherweise etwas Besonderes ist und Windows Sie möglicherweise nicht gerne bewegt. In der Shell-Appbar-API-Implementierung für die Taskleiste gibt es viele Sonderfälle.

Um zu einem anderen Monitor zu wechseln, verwenden Sie EnumDisplayMonitors() mit GetMonitorInfo(). Einige Monitore können negative Koordinaten haben.

+1

Das ist eine schreckliche Idee. Bitte tun Sie das Ihren Kunden nicht. –

+7

Bis OP uns sagt, warum er es machen will, wissen wir nicht. Es gibt zwei Dinge zu beachten: ist es möglich und ist es eine gute Idee. Wir sind nur hier, um das erstere und nicht das spätere zu betrachten. Obwohl ich im Allgemeinen zustimme, dass es nicht gut ist, die Benutzer-Taskleiste zu verschieben, kann ich auch mindestens zwei gültige Fälle sehen, um sie auf die Benutzeranforderung hin zu verschieben. Da wir es nicht wissen, wollen wir versuchen, nicht zu viel zu urteilen. –

+0

@jeffamaphone: Wir sind hier, weil wir uns entschieden haben hier zu sein. Wen willst du sagen, wir sind nur für einen und nicht für den anderen hier? –

0

SHAppBarMessage (ABM_SETPOS, ...)

+1

'ABM_GETTASKBARPOS' ruft die Position der Taskleiste ab. Aber, ABM_SETPOS funktioniert nicht gut. Ich habe Taskleiste hWnd durch Nachschlagen von "Shell_TrayWnd" erhalten. (Ich benutze Windows 7) Aber, kein Glück. MoveWindow/SetWindowPos und alle anderen ABM_ * funktionieren nicht. Aber danke. – minjang

4

Ich hatte ein wenig Glück mit dieser Aufgabe in einem AutoHotkey-Skript, nur für den Fall, dass Sie nicht über die verwendete Sprache kümmern. Es verwendet simulierte Tastenanschläge und Mausbewegungen, um die Taskleiste zu verschieben. Ich hörte kurz auf, die Taskleiste automatisch zu entsperren/zu sperren.

Der schwierige Teil war es zuverlässig zu arbeiten. Ein Großteil des Codes ist dafür vorgesehen, dass die Taskleiste verschoben wird. Es funktioniert immer noch nicht 100% ... es scheitert wie 10% der Zeit von dem, was ich gesehen habe. Allerdings sollte es gut genug sein, um loszulegen!

Wenn ich jemals wieder zu diesem Skript komme, um es perfekt funktionieren zu lassen, werde ich es hier erneut veröffentlichen. Hier

ist das Beispiel-Script (Hervorhebung etwas seltsam hier ist, wie die Sprache ist 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

Ich habe auch diesen Bedarf auf Windows 7. Hier ist meine Meinung ist, dies mit autohotkey Skript zu tun :

; 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 

Ich habe dies auf Windows 7 mit klassischen Fenster Thema getestet. Um dies zu verwenden, weisen Sie einen Hotkey zum Aufrufen dieses Skripts zu, positionieren Sie dann den Mauszeiger an die Stelle, an die Sie die Taskleiste ziehen möchten, und drücken Sie dann den Hotkey.

+0

funktioniert perfekt! Danke! (Ich musste die genauen Koordinaten auf x + 10, y-35 für meine Auflösung und Thema optimieren) – staafl

+0

Genau das, was ich brauchte, das machte mich verrückt. Vielen Dank! Hinweis: Ich musste die Variablen w und h verwenden, um separate Offsets für verschiedene Startpositionen der Taskleiste zu definieren. –

+0

Funktioniert unter Windows 10. Ich habe es leicht modifiziert, um die Taskleiste immer gleich groß zu machen, und sie dem Scheduler hinzugefügt, damit sie auf dem Arbeitsplatz entsperrt wird. –

Verwandte Themen