2012-09-15 11 views
10

डॉकिंग के आधार पर चीजों को संभव निम्नलिखित VBScript या किसी अन्य प्रोग्रामिंग भाषा का उपयोग कर रहे:विंडोज बदलें 7 टास्कबार स्थान स्वचालित रूप से स्क्रीन आकार पर या स्थिति

  • स्क्रीन आकार का पता लगाने - या कंप्यूटर
  • परिवर्तन डॉक किया गया है कि क्या Windows कार्यपट्टी स्थान

मैं क्या हासिल करने की कोशिश कर रहा हूँ:

मेरे लैपटॉप में 14 "वाइडस्क्रीन है: बहुत चौड़ा, लेकिन बहुत अधिक नहीं। मुझे स्क्रीन के बाईं ओर स्थित विंडोज टास्कबार रखना सबसे सुविधाजनक लगता है, क्योंकि मैं चौड़ाई को छोड़ सकता हूं लेकिन ऊर्ध्वाधर स्थान नहीं।

हालांकि, जब कार्यालय में, मेरा कंप्यूटर एक डॉकिंग स्टेशन में बैठता है और एक अच्छी बड़ी स्क्वायरिश स्क्रीन पर लगा हुआ है। यहां मैं टास्कबार को अपने डिफ़ॉल्ट स्थान यानी नीचे रखना पसंद करता हूं।

मुझे पता है कि टास्कबार गुणों में मैन्युअल रूप से दो टास्कबार स्थानों के बीच स्विच कैसे करें। लेकिन मैं इसे रोजाना कुछ बार करता हूं, जो कि कष्टप्रद है। मेरा सवाल है: क्या मेरे पास टास्कबार स्थान स्वचालित रूप से बदल सकता है?

उदाहरण के लिए, स्टार्टअप पर (या ऊपर सीतनिद्रा से जगा) एक स्क्रिप्ट चलाने होगा जो पता लगाता है या तो: 3:

  • स्क्रीन आकार 4 से अधिक लंबी है? (या जो भी संख्या)
  • क्या कंप्यूटर डॉकिंग स्टेशन में डॉक किया गया है?

यदि हां, तो नीचे टास्कबार डालें, बाकी बाईं ओर।

कोई भी जानता है कि यह कैसे करें या मुझे सही रास्ते पर रख सकें? या क्या वहां पहले से ही एक उपयोगिता है जो यह कर सकती है?

+0

एक निश्चित बात यह है कि VBScript किसी भी बिना टास्कबार स्थान बदलने के लिए नहीं कर सकेंगे है तीसरे पक्ष के उपकरण। मैं वर्तमान स्क्रीन आकार और अभिविन्यास के आधार पर बदलते टास्कबार स्थान को स्वचालित करने के साथ-साथ डॉकिंग स्थिति (WMI ऑब्जेक्ट के माध्यम से) पूछताछ के लिए * ऑटोआईटी * स्क्रिप्ट (माउस फ़ंक्शंस के माध्यम से) का उपयोग करने का सुझाव देता हूं। – Jay

+1

जय, मैंने साबित किया कि यह किया जा सकता है, मेरा जवाब देखें, vbscript अनुमान के तहत नहीं – peter

उत्तर

7

// क्यों यह किसी और का मशीन पर एक अच्छा विचार नहीं है पर सामान्य बढ़ाने छोड़े गए

एक स्क्रिप्टिंग भाषा नहीं हो सकता है यहाँ एक अच्छा विकल्प है, तो आप कुछ that pumps the message to listen to WM_DISPLAYCHANGE की जरूरत है।

जब आपको संदेश मिलता है तो आपको अपने मॉनीटर के प्रस्तावों के आधार पर टास्क बार की वांछित अभिविन्यास की गणना करने की आवश्यकता होती है। फिर आप विंडोज एक्सप्लोरर को बंद करने के लिए आरएमशूटडाउन का उपयोग करते हैं।

// अप्रलेखित व्यवहार शुरू होता है, कभी भी

टास्कबार डॉकिंग बढ़त बाइट 13 (APPBARDATA से ABE में से एक मान के रूप में) में संग्रहीत किया जाता टूट सकता है और स्थिति एक के रूप में बाइट 25-40 में संग्रहित है win32 RECT। आप एक्सप्लोरर को पुनरारंभ करने से पहले सेटिंग को संशोधित कर सकते हैं।

// अप्रलेखित व्यवहार

नमूना कोड समाप्त हो जाती है (पूर्ण स्रोत https://github.com/jiangsheng/Samples/tree/master/AppBarTest पर):

//returns the process id and create time for the oldest explorer.exe 
RM_UNIQUE_PROCESS GetExplorerApplication() 
{ 
    RM_UNIQUE_PROCESS result={0}; 
    DWORD bytesReturned=0; 
    DWORD processIdSize=4096; 
    std::vector<DWORD> processIds; 
    processIds.resize(1024); 
    EnumProcesses(processIds.data(),processIdSize,&bytesReturned); 
    while(bytesReturned==processIdSize) 
    { 
     processIdSize+=processIdSize; 
     processIds.resize(processIdSize/4); 
     EnumProcesses(processIds.data(),processIdSize,&bytesReturned); 
    } 

    std::for_each(processIds.begin(), processIds.end(), [&result] (DWORD processId) { 
     HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, 
            FALSE, processId); 
     if (hProcess) { 
      std::wstring imageName; 
      imageName.resize(4096); 
      if(GetProcessImageFileName (hProcess,(LPWSTR)imageName.data(),4096)>0) 
      { 
       if(wcscmp(L"explorer.exe",PathFindFileName(imageName.data()))==0) 
       { 
        //this is assmuing the user is not running elevated and won't see explorer processes in other sessions 
        FILETIME ftCreate, ftExit, ftKernel, ftUser; 
        if (GetProcessTimes(hProcess, &ftCreate, &ftExit,&ftKernel, &ftUser)) 
        { 
         if(result.dwProcessId==0) 
         { 
          result.dwProcessId=processId; 
          result.ProcessStartTime=ftCreate; 
         } 
         else if(CompareFileTime(&result.ProcessStartTime,&ftCreate)>0) 
         { 
          result.dwProcessId=processId; 
          result.ProcessStartTime=ftCreate; 
         } 
        } 
       } 
      } 
      CloseHandle(hProcess); 
     } 
    }); 
    return result; 
} 
    //taskbar position calculating code omitted 
    DWORD dwSession=0; 
    WCHAR szSessionKey[CCH_RM_SESSION_KEY+1] = { 0 }; 
    DWORD dwError = RmStartSession(&dwSession, 0, szSessionKey); 
    if (dwError == ERROR_SUCCESS) { 
     RM_UNIQUE_PROCESS rgApplications[1]={GetExplorerApplication()}; 
     dwError=RmRegisterResources(
      dwSession,0,NULL,1,rgApplications,0,NULL); 
     DWORD dwReason; 
     UINT nProcInfoNeeded; 
     UINT nProcInfo = 10; 
     RM_PROCESS_INFO rgpi[10]; 
     dwError = RmGetList(dwSession, &nProcInfoNeeded, 
         &nProcInfo, rgpi, &dwReason); 
     if(dwReason==RmRebootReasonNone)//now free to restart explorer 
     { 
      RmShutdown(dwSession,RmForceShutdown,NULL);//important, if we change the registry before shutting down explorer will override our change 
      //using undocumented setting structure, could break any time 
      //edge setting is stored at HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2!Settings 
      HKEY hKey={0}; 
      DWORD result=0; 
      result=::RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects2"), 
        0, KEY_READ|KEY_WRITE, &hKey) ; 
      if (result== ERROR_SUCCESS) 
      { 
       std::vector<BYTE> data; 
       data.resize(256); 
       TCHAR settingValue[]= _T("Settings"); 
       DWORD dwKeyDataType=0; 
       DWORD dwDataBufSize=data.size(); 
       result=::RegQueryValueEx(hKey,settingValue, NULL, &dwKeyDataType, 
        (LPBYTE) data.data(), &dwDataBufSize); 
       while(ERROR_MORE_DATA==result) 
       { 
        data.resize(256+data.size()); 
        dwDataBufSize=data.size(); 
        result=::RegQueryValueEx(hKey,settingValue, NULL, &dwKeyDataType, 
         (LPBYTE) data.data(), &dwDataBufSize); 
       } 
       data.resize(dwDataBufSize); 
       if(result==ERROR_SUCCESS) 
       { 
        switch (dwKeyDataType) 
        { 
         case REG_BINARY: 
          if(data.size()==40) 
          { 
           BYTE taskbarPosition=data[12]; 
           taskbarPosition=edge; 
           data[12]=taskbarPosition; 
           RECT* taskbarRect=(RECT*)&data[24]; 
           CopyRect (taskbarRect,&abd.rc); 
           result=::RegSetValueEx(hKey,settingValue,0,REG_BINARY,(LPBYTE) data.data(), dwDataBufSize); 
          } 
          break; 
        } 
       } 
       ::RegCloseKey(hKey); 
      } 
      RmRestart (dwSession,0,NULL); 
     } 
    } 
    RmEndSession(dwSession); 
2

आप एक साधारण बैच में या एक स्क्रिप्ट से ऐसा कर सकते हैं। अपनी स्क्रीन के वर्तमान रिज़ॉल्यूशन के आधार पर टास्कबार को स्थिति देने के लिए रजिस्ट्री मान सेट करें (यदि डॉकिंग में यह अधिक होगा) और फिर explorer.exe को पुनरारंभ करें। तो जैसे अपनी स्क्रीन के बाईं टास्कबार स्थापित करने के लिए एक बैच होगा (यह मानते हुए आप घ में bottom.reg फ़ाइल है: \ लिपियों फ़ोल्डर) जा

reg add d:\scripts\Bottom.reg 
@echo off taskkill /f /IM explorer.exe 
explorer.exe 

bottom.reg की सामग्री

हैं
Windows Registry Editor Version 5.00 

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2] 
"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,03,00,00,00,3e,00,00,00,2e,\ 
    00,00,00,00,00,00,00,82,04,00,00,80,07,00,00,b0,04,00,00 

और left.reg

Windows Registry Editor Version 5.00 

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2] 
"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,00,00,00,00,3e,00,00,00,2e,\ 
    00,00,00,00,00,00,00,00,00,00,00,3e,00,00,00,b0,04,00,00 

के लिए आप कुछ अस्थिर होगा लेकिन जब से आप ऐसा करते हैं जब आप खिड़कियों कि एक समस्या मैं लगता नहीं होगा शुरू करते हैं। मैं विंडोज पर यह परीक्षण किया 7.

संपादित करें: एक VBScript जिस स्क्रीन के आधार पर एक ही बात करता है बनाया

HKEY_CURRENT_USER = &H80000001 
Set WshShell = CreateObject("WScript.Shell") 
strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set ObjRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") 

'Get curr. user name 
Set colItems = objWMIService.ExecQuery("Select * From Win32_ComputerSystem") 
For Each objItem in colItems 
    strCurrentUserName = objItem.UserName 
Next 

Set colItems = objWMIService.ExecQuery("Select * From Win32_DesktopMonitor where DeviceID = 'DesktopMonitor1'",,0) 
For Each objItem in colItems 
    intHorizontal = objItem.ScreenWidth 
    intVertical = objItem.ScreenHeight 
Next 

bottom = Array(&H28,&H00,&H00,&H00,&Hff,&Hff,&Hff,&Hff,&H02,&H00,&H00,&H00,&H03,&H00,&H00,&H00,&H3e,&H00,&H00,&H00,&H2e,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H82,&H04,&H00,&H00,&H80,&H07,&H00,&H00,&Hb0,&H04,&H00,&H00) 
left_ = Array(&H28,&H00,&H00,&H00,&Hff,&Hff,&Hff,&Hff,&H02,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H3e,&H00,&H00,&H00,&H2e,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H3e,&H00,&H00,&H00,&Hb0,&H04,&H00,&H00) 

if intHorizontal >= 1920 then 
    regdata = bottom 
else 
    regdata = left_ 
end if 

ObjRegistry.SetBinaryValue HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2\", "Settings", regdata 

'Restart user shell 
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'Explorer.exe'") 
For Each objProcess in colProcessList 
    colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain) 
    wscript.echo colProperties 
    If strUserDomain & "\" & strNameOfUser = strCurrentUserName then 
    wscript.echo "restarting" 
     objProcess.Terminate() 
    end if 
Next 
संबंधित मुद्दे