2010-01-14 20 views
25

मैं किसी अन्य मॉनिटर (यदि दोहरी मॉनीटर) सहित किसी अन्य स्थिति में विंडोज टास्कबार को स्थानांतरित करने (या आकार बदलने) के लिए किसी प्रकार का एपीआई या वर्कअराउंड (उदा।, स्क्रिप्ट या रजिस्ट्री) जानना चाहता हूं। निश्चित रूप से, हम माउस का उपयोग करके टास्क बार ले जा सकते हैं, लेकिन मैं इसे किसी प्रोग्राम, या स्वचालित तरीके से ले जाना चाहता हूं।विंडोज़ टास्कबार को प्रोग्रामेटिक रूप से कैसे स्थानांतरित करें?

मैंने Win32 API खोजने की कोशिश की, लेकिन ऐसा लगता है कि यह कोई भी काम नहीं करता है।

संपादित करें: मैं कई लोगों की राय से हैरान था। मुझे समझाएं कि मैं इसे क्यों चाहता था। मेरे कार्यस्थल में, मैं दोहरी मॉनीटर का उपयोग कर रहा हूं (संकल्प अलग हैं), और टास्कबार बाएं मॉनीटर पर रखा गया है जबकि प्राथमिक मॉनिटर सही मॉनिटर है। हालांकि, मैं अक्सर दूरस्थ डेस्कटॉप के माध्यम से अपने कार्यस्थल कंप्यूटर से कनेक्ट करता हूं। रिमोट कनेक्शन के बाद, टास्कबार स्थिति स्विच हो जाती है। यही कारण है कि मैं एक साधारण प्रोग्राम बनाना चाहता था जो टास्कबार की स्थिति को सहेज/पुनर्स्थापित कर सके। हर दिन मुझे अपनी टास्कबार को पुनर्व्यवस्थित करना होता है। बस। मैं बस इसे मुझे के लिए चाहता हूं।

+2

डाउनवोट क्यों? यह एक पूरी तरह से तैयार सूत्र है। संदिग्ध इरादे के रूप में, मैंने यहां और भी बदतर उत्तर दिया है ... – Thomas

+0

खैर, थॉमस, तर्क दिया जा सकता है कि सवाल उपयोगी नहीं है क्योंकि यह एक ऐसा कार्य नहीं है जिसे कार्यक्रम करना चाहिए। हालांकि, हम वास्तव में मिंजांग के कार्यक्रम के इरादे को नहीं जानते हैं, तो चलो सभी संदेह का लाभ देते हैं, क्या हम? –

+8

"कोई काम नहीं है कि कार्यक्रम करना चाहिए" - वास्तव में? आप उस निष्कर्ष रोब पर कैसे पहुंचते हैं? यदि आपने कभी भी बहु-मॉनिटर वातावरण में काम किया है तो आपको पता चलेगा कि इस प्रकार के ऐप्स (जैसे अल्ट्रामॉन - http://www.realtimesoft.com/ultramon/) लगभग आवश्यक हैं। किसने आपको नियुक्त किया कि किस कार्यक्रम को करना चाहिए? यह एक बिल्कुल अच्छा सवाल है; मुझसे +1 – Gerard

उत्तर

3

जहां तक ​​मेरा बता सकते हैं, विस्टा और बाद किसी भी कार्य पट्टी ले जाने का प्रयास कार्यक्रम ध्यान न दें। पुरानी विधि ABM_SETPOS + MoveWindow थी, और यह अब टास्कबार पर काम नहीं करती है। एकमात्र तरीका जिसे मैं अभी भी काम करता हूं उसके बारे में जानता हूं, एक माउस चाल (क्लिक-मूव-रिलीज) को अनुकरण कर रहा है। मैंने उस विधि के बारे में पढ़ा है, लेकिन मैंने इसे कभी नहीं किया है।

6

टास्कबार एक खिड़की है। इसे स्थानांतरित करने के लिए SetWindowPos() का उपयोग करें। SHAppBarMessage() और ABM_WINDOWPOSCHANGED भी देखें।

हालांकि टास्कबार विशेष हो सकता है और विंडोज आपको पसंद नहीं कर सकता है। टास्कबार के लिए शैल एपबार एपीआई कार्यान्वयन में बहुत से विशेष मामले हैं।

किसी अन्य मॉनीटर पर जाने के लिए, EnumDisplayMonitors()GetMonitorInfo() के साथ उपयोग करें। कुछ मॉनिटर्स में नकारात्मक निर्देशांक हो सकते हैं।

+1

यह एक भयानक विचार है। कृपया अपने ग्राहकों को ऐसा न करें। –

+7

जब तक ओपी हमें नहीं बताता कि वह ऐसा क्यों करना चाहता है, हम नहीं जानते। विचार करने के लिए दो चीजें हैं: क्या यह संभव है और क्या यह एक अच्छा विचार है। हम केवल पूर्व पर विचार करने के लिए यहां हैं और बाद में नहीं। हालांकि मैं आम तौर पर सहमत हूं कि उपयोगकर्ताओं को टास्क बार को स्थानांतरित करना अच्छा नहीं है, मैं उपयोगकर्ताओं के अनुरोध पर इसे स्थानांतरित करने के लिए कम से कम दो मान्य मामलों को भी देख सकता हूं। चूंकि हम नहीं जानते हैं, इसलिए बहुत अधिक न्याय न करने का प्रयास करें। –

+0

@jeffamaphone: हम यहां हैं क्योंकि हम यहां रहना चुनते हैं। आप कौन कहने के लिए हैं कि हम केवल एक के लिए हैं और दूसरे नहीं? –

0

SHAppBarMessage (ABM_SETPOS, ...)

+1

'ABM_GETTASKBARPOS' टास्कबार की स्थिति पुनर्प्राप्त करता है। लेकिन, ABM_SETPOS अच्छी तरह से काम नहीं कर रहा है। मैंने "Shell_TrayWnd" को देखकर टास्कबार की एचडब्ल्यूएनडी प्राप्त की है। (मैं विंडोज 7 का उपयोग कर रहा हूँ) लेकिन, कोई भाग्य नहीं। MoveWindow/SetWindowPos और कोई अन्य ABM_ * काम नहीं कर रहा है। लेकिन धन्यवाद। – minjang

4

मुझे इस कार्य के साथ ऑटोहॉटकी स्क्रिप्ट में कुछ भाग्य मिला है, बस अगर आपको इस्तेमाल की जाने वाली भाषा की परवाह नहीं है। यह आपके टास्कबार को स्थानांतरित करने के लिए सिम्युलेटेड कीस्ट्रोक और माउस मूवमेंट का उपयोग करता है। मैंने टास्कबार को स्वचालित रूप से अनलॉक/लॉक करने से रोक दिया।

कठिन हिस्सा इसे विश्वसनीय रूप से काम करने के लिए प्राप्त कर रहा था। बहुत सारे कोड यह सुनिश्चित करने के लिए समर्पित हैं कि टास्कबार चले गए। यह अभी भी 100% काम नहीं करता है ... यह मैंने जो देखा है उससे 10% समय की तरह विफल रहता है। हालांकि, यह शुरू करने के लिए पर्याप्त होना चाहिए!

यदि मैं कभी भी पूरी तरह से काम करने के लिए इस स्क्रिप्ट पर वापस आ जाता हूं, तो मैं यहां दोबारा पोस्ट करूंगा।

यहाँ उदाहरण स्क्रिप्ट है (हाइलाइटिंग यहाँ थोड़ा अजीब है, के रूप में भाषा 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

यहाँ इस का उपयोग करते हुए AutoHotkey स्क्रिप्ट करने के लिए मेरी ले है मैं भी विंडोज 7 पर इस की जरूरत है :

; 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 

मैंने क्लासिक विंडो थीम के साथ विंडोज 7 पर इसका परीक्षण किया है। इसका उपयोग करने के लिए, इस स्क्रिप्ट को कॉल करने के लिए हॉटकी असाइन करें, फिर माउस कर्सर को उस स्थान पर रखें जहां आप टास्कबार को खींचना चाहते हैं, फिर हॉटकी दबाएं।

+0

पूरी तरह से काम करता है! धन्यवाद! (मुझे अपने संकल्प और विषय के लिए x + 10, y-35 के सटीक निर्देशांक को ट्विक करना पड़ा) – staafl

+0

बिल्कुल मुझे जो चाहिए, वह मुझे पागल कर रहा था। धन्यवाद! नोट: मुझे अलग-अलग टास्कबार प्रारंभिक पदों के लिए अलग ऑफसेट को परिभाषित करने के लिए डब्ल्यू और एच चर का उपयोग करना पड़ा। –

+0

विंडोज 10 पर काम करता है। मैंने टास्कबार को हमेशा एक ही आकार बनाने के लिए थोड़ा सा संशोधित किया है और इसे वर्कस्टेशन अनलॉक पर चलाने के लिए शेड्यूलर में जोड़ा है। –

संबंधित मुद्दे