Modifier l’emplacement de la barre des tâches Windows 7 automatiquement en fonction de la forme de l’écran ou de l’état de l’ancrage

Les choses suivantes sont-elles possibles en utilisant VBScript ou tout autre langage de programmation:

  • détecter la forme de l’écran – ou si l’ordinateur est ancré
  • changer l’emplacement de la barre des tâches Windows

Ce que j’essaie de réaliser:

Mon ordinateur portable a un écran large de 14 pouces: assez large, mais pas très grand. Je trouve très pratique d’avoir la barre des tâches Windows à gauche de l’écran, car je peux épargner la largeur mais pas l’espace vertical.

Cependant, lorsque je suis au bureau, mon ordinateur est installé dans une station d’accueil et raccordé à un grand écran carré. Ici, je préfère de beaucoup avoir la barre des tâches dans son emplacement par défaut, c’est-à-dire en bas.

Je sais comment basculer manuellement entre les deux emplacements de la barre des tâches dans les propriétés de la barre des tâches. Mais je le fais plusieurs fois par jour, ce qui est plutôt ennuyeux. Ma question est la suivante: puis-je modifier l’emplacement de la barre des tâches automatiquement?

Par exemple, lors du démarrage (ou de la veille prolongée), un script s’exécutant détecte soit:

  • La forme de l’écran est-elle plus grande que 4: 3? (ou quel que soit le nombre)
  • L’ordinateur est-il connecté à la station d’accueil?

Si oui, mettez la barre des tâches en bas, sinon à gauche.

Quelqu’un sait comment faire ou peut me mettre sur la bonne voie? Ou existe-t-il déjà un utilitaire qui peut le faire?

// Augmente normalement la raison pour laquelle ce n’est pas une bonne idée sur la machine de quelqu’un d’autre omis

Un langage de script peut ne pas être un bon choix ici, vous avez besoin de quelque chose qui pousse le message à écouter WM_DISPLAYCHANGE .

Lorsque vous recevez le message, vous devez calculer l’orientation souhaitée de la barre des tâches en fonction des résolutions de vos moniteurs. Ensuite, vous utilisez RmShutdown pour fermer l’Explorateur Windows.

// comportement non documenté commence, peut casser à tout moment

Le bord d’ancrage de la barre des tâches est stocké dans l’octet 13 (comme l’une des valeurs ABE d’ APPBARDATA ) et la position est stockée dans l’octet 25-40 en tant que win32 RECT . Vous pouvez modifier le paramètre avant de redémarrer l’explorateur.

// comportement non documenté se termine

Exemple de code (source complète à l’ adresse 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 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::wssortingng 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 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); 

Vous pouvez le faire dans un lot simple ou à partir d’un script. Définissez la valeur de registre pour positionner la barre des tâches en fonction de la résolution actuelle de votre écran (si dans la station d’accueil il sera plus élevé), puis redémarrez explorer.exe. Par exemple, un lot pour définir la barre des tâches à gauche de votre écran serait (en supposant que vous avez le fichier bottom.reg dans le dossier d: \ scripts)

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

Le contenu de bottom.reg est

 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 

et pour 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 

Vous aurez un peu de scintillement, mais puisque vous allez le faire lorsque vous démarrez Windows, je suppose que ce ne sera pas un problème. Je l’ai testé sur Windows 7.

EDIT: fait un vbscript qui fait la même chose en fonction de la résolution de l’écran

 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