2010-01-14 4 views
25

Windows 작업 표시 줄을 다른 모니터 (이중 모니터 인 경우)를 포함하여 다른 위치로 이동 (또는 크기 조정) 할 수있는 API 또는 해결 방법 (예 : 스크립트 또는 레지스트리)을 알고 싶습니다. 물론 마우스를 사용하여 작업 표시 줄을 이동할 수도 있지만 프로그램이나 자동화 된 방식으로 이동하려고합니다.프로그래밍 방식으로 Windows 작업 표시 줄을 이동하는 방법?

Win32 API를 찾으려고했지만 아무도이 작업을 수행하지 않습니다.

수정 : 나는 많은 사람들의 의견에 놀랐다. 내가 왜 그걸 원했는지 설명하겠습니다. 직장에서는 듀얼 모니터 (해상도가 다름)를 사용 중이며 작업 표시 줄은 기본 모니터가 올바른 모니터 인 동안 왼쪽 모니터에 배치됩니다. 그러나 종종 원격 데스크톱을 통해 직장 컴퓨터에 연결합니다. 원격 연결 후 작업 표시 줄 위치가 전환됩니다. 그래서 저는 작업 표시 줄의 위치를 ​​저장/복원 할 수있는 간단한 프로그램을 만들고 싶었습니다. 매일 작업 표시 줄을 다시 정렬해야합니다. 그게 전부 야. 난 그저 을 원한다.

+2

왜 downvote? 그것은 완벽하게 공식화 된 질문입니다. 반신 반의하는 의도에 관해서는, 나는 여기에서 대답되는 것이 훨씬 더 악화 된 것을 보았다. – Thomas

+0

음, Thomas는 프로그램이해야 할 일이 아니기 때문에 질문이 유용하지 않다는 주장을 할 수 있습니다. 그러나 우리는 민장 프로그램의 의도를 알지 못하기 때문에 의문의 여지를 남겨 두지 않겠습니까? –

+8

"프로그램이해야 할 일이 아닙니다"- 정말요? 당신은 그 결론 Rob에 어떻게 도착합니까? 다중 모니터 환경에서 작업 한 적이 있다면 UltraMon과 같은 유형의 앱 (http://www.realtimesoft.com/ultramon/)이 거의 필수적이라는 것을 알고있을 것입니다. 누가 어떤 프로그램을해야만하는지 하나님을 임명 한 사람은 누구입니까? 이것은 매우 좋은 질문입니다. +1. – Gerard

답변

3

는 지금까지 내가 말할 수있는, Vista 및 이후 작업 표시 줄을 이동하려는 모든 프로그램을 무시합니다. 이전 방법은 ABM_SETPOS + MoveWindow 였고 더 이상 작업 표시 줄에서 작동하지 않습니다. 내가 아직도 알고있는 유일한 방법은 마우스 이동 (클릭 이동 릴리스)을 시뮬레이션하는 것입니다. 나는 그 방법에 대해 읽었지 만, 나는 그것을 한 번도 해본 적이 없다.

6

작업 표시 줄은 창입니다. 이동하려면 SetWindowPos()을 사용하십시오. SHAppBarMessage() 및 ABM_WINDOWPOSCHANGED도 참조하십시오.

비록 작업 표시 줄이 특별하고 Windows가 주위를 움직이는 것을 좋아하지 않을 수도 있지만. 작업 표시 줄에 대한 셸 응용 프로그램 API 구현에는 많은 특수한 경우가 있습니다.

다른 모니터로 이동하려면 EnumDisplayMonitors()GetMonitorInfo()과 함께 사용하십시오. 일부 모니터는 음의 좌표를 가질 수 있습니다.

+1

이것은 끔찍한 생각입니다. 고객에게 그렇게하지 마십시오. –

+7

OP가 왜 그가 그것을하고 싶어하는지 알려줄 때까지, 우리는 모른다. 고려해야 할 두 가지가 있습니다 : 가능하고 좋은 생각입니다. 우리는 이전과 후의 것을 고려하기 위해 여기에만 있습니다. 일반적으로 사용자 작업 표시 줄을 이동하는 것이 좋지 않다고 동의하지만 사용자 요청시 이동 작업을위한 두 가지 유효한 경우도 볼 수 있습니다. 우리가 모르기 때문에, 너무 많이 판단하지 않도록하십시오. –

+0

@ jeffamaphone : 우리가 여기 있기로 결정했기 때문에 여기 있습니다. 너는 우리가 오직 하나만을위한 것이지 다른 하나의 것이 아니라고 누가 말 하겠니? –

0

는 SHAppBarMessage은 (ABM_SETPOS, ...)

+1

'ABM_GETTASKBARPOS'는 작업 표시 줄의 위치를 ​​가져옵니다. 그러나 ABM_SETPOS가 제대로 작동하지 않습니다. 나는 "Shell_TrayWnd"를 올려서 작업 표시 줄의 hWnd를 얻었다. (저는 Windows 7을 사용하고 있습니다) 그러나 운이 없습니다. MoveWindow/SetWindowPos 및 다른 ABM_ *가 작동하지 않습니다. 하지만 고마워. – minjang

4

사용 된 언어에 신경 쓰지 않기 때문에 AutoHotkey 스크립트에서이 작업에 약간의 행운을 보았습니다. 그것은 시뮬레이션 된 키 입력과 마우스 움직임을 사용하여 작업 표시 줄을 이동합니다. 나는 자동으로 작업 표시 줄 잠금을 해제/잠그지 못했습니다.

어려운 부분이 안정적으로 작동하도록하고있었습니다. 많은 코드는 작업 표시 줄이 움직 였는지 확인하는 데 전념합니다. 그것은 여전히 ​​100 % 작동하지 않습니다 ... 그것은 내가 본 것의 시간의 10 %처럼 실패합니다. 그러나, 당신을 시작하게 충분히 좋을 것입니다!

완벽하게 작동하도록이 스크립트로 돌아온 경우 여기에서 다시 게시 해 보겠습니다. 다음은이 사용 AutoHotkey에 스크립트를 할 나의 포획이다 나는 또한 윈도우 7에서이 필요가

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

: 여기

는 (언어 AHK 같이 강조는, 여기 좀 이상한) 예제 스크립트입니다 :

; 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에서 테스트했습니다. 이 기능을 사용하려면 단축키를 지정하여이 스크립트를 호출 한 다음 마우스 커서를 작업 표시 줄을 드래그 할 위치로 가져간 다음 단축키를 누릅니다.

+0

은 완벽하게 작동합니다. 고맙습니다! (내 해상도와 테마에 대해 x + 10, y-35의 정확한 좌표를 조정해야 함) – staafl

+0

정확히 내가 필요한 것, 이것이 나를 미치게 만들었습니다. 감사! 참고 : 다른 작업 표시 줄 시작 위치에 대해 별도의 오프셋을 정의하려면 w 및 h 변수를 사용해야했습니다. –

+0

Windows에서 작동 10. 작업 표시 줄을 항상 동일한 크기로 만들기 위해 약간 수정하고 워크 스테이션 잠금 해제에서 실행되도록 스케줄러에 추가했습니다. –

관련 문제