Page 1 sur 1
déplacement fenêtre en mode etendu (2 écrans)
Posté : mar. 31 mai 2016 10:53
par microtec
Bonjour,
j'ai fait quelques recherches mais je ne trouve pas mon bonheur.
Je travail avec un surface 4 et un écran avec un Microsoft Wireless Display Adapter donc.
J'ai donc une surface deux écrans un tactile l'autre 24" standard, sans clavier ni souris.
J'ai un problème car je dois impérativement travailler en mode étendu pas de mode clone.
Il met impossible d'envoyer la fenêtre active sur le second écran, en effet je n'ai que l'écran tactile et il est impossible d'envoyer la fenêtre active sur le second écran.
J'ai cherche à faire l'envoi sur le second écran avec les raccourcis Windows, MAIS le clavier tactile de la surface ne propose pas la touche Windows, donc impossible de faire un Win+Shift+Fleche droite.
Une possibilité existe en utilisant le clavier visuel , mais il n'est vraiment pas pratique.
Voilà pour la mise en situation, mon besoin donc, pouvoir envoyer la fenêtre active sur le second écran et surtout le faire revenir. Simulé les touches raccourcis avec la fonction "Send" ne semble pas autorisé par auto IT.
Quelqu'un aurez-t'il une idée?
Merci de votre aide.
Re: déplacement fenêtre en mode etendu (2 écrans)
Posté : mar. 31 mai 2016 13:34
par orax
Eh... si ça marche avec Send (testé sur Windows 8).
Re: déplacement fenêtre en mode etendu (2 écrans)
Posté : mar. 31 mai 2016 14:17
par microtec
En effet, mais j'ai du exécuter le script via un raccourci, car sinon ma fenêtre ne se transfert pas sur le second écran n'étant pas active!
tu as une autre méthode? peu-t’on connaitre la dernière fenêtre d'active avec autoit?
Merci Encore!
Re: déplacement fenêtre en mode etendu (2 écrans)
Posté : mer. 01 juin 2016 16:02
par TomAijerrie
winmove si tu connais le nom de la fenêtre
Re: déplacement fenêtre en mode etendu (2 écrans)
Posté : mer. 01 juin 2016 18:04
par ZDS
Bonjour Microtec,
Voici une alternative au Send, utilisant WinMove et une fonction récupérant les différents écrans et leurs positions/résolutions. Elle semble plutôt compliquée, mais en suivant les commentaires tu vas comprendre ce qu'elle fait très facilement.
Code : Tout sélectionner
; Récupération des différentes résolutions (dans le cas d'un multiscreen par exemple)
Func getResolutions()
Local $resultat[1][6] = [[0, "", 1, 1, "-", "Macros"]], $i = 0, $dll = DllOpen("user32.dll")
If $dll <> -1 Then
While 1
Local $struct = DllStructCreate("dword cb;char DeviceName[32];char DeviceString[128];dword StateFlags;char DeviceID[128];char DeviceKey[128]")
DllStructSetData($struct, "cb", DllStructGetSize($struct))
Local $retour = DllCall($dll, "int", "EnumDisplayDevices", "ptr", 0, "dword", $i, "ptr", DllStructGetPtr($struct), "dword", 0)
If Not $retour[0] Then ExitLoop
If Not BitAND(DllStructGetData($struct, "StateFlags"), 0x00000008) Then
Local $device = DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _
"ushort dmDriverExtra;dword dmFields;long x;long y;dword dmDisplayOrientation;dword dmDisplayFixedOutput;" & _
"short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _
"byte dmFormName[32];ushort LogPixels;dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _
"dword dmDisplayFlags;dword dmDisplayFrequency")
DllStructSetData($device, "dmSize", DllStructGetSize($device))
$retour = DllCall($dll, "int", "EnumDisplaySettings", "str", DllStructGetData($struct, "DeviceName"), "dword", -1, "ptr", DllStructGetPtr($device))
If $retour[0] And DllStructGetData($device, "dmPelsWidth") > 0 And DllStructGetData($device, "dmPelsHeight") > 0 Then
$resultat[0][0] = $resultat[0][0] + 1
ReDim $resultat[$resultat[0][0]+1][6]
$resultat[$resultat[0][0]][0] = DllStructGetData($device, "x")
$resultat[$resultat[0][0]][1] = DllStructGetData($device, "y")
$resultat[$resultat[0][0]][2] = DllStructGetData($device, "dmPelsWidth")
$resultat[$resultat[0][0]][3] = DllStructGetData($device, "dmPelsHeight")
$resultat[$resultat[0][0]][4] = $i
$resultat[$resultat[0][0]][5] = DllStructGetData($struct, "DeviceName")
If $resultat[$resultat[0][0]][0] = 0 And $resultat[$resultat[0][0]][1] = 0 Then
$resultat[0][2] = $resultat[$resultat[0][0]][2]/@DesktopWidth
$resultat[0][3] = $resultat[$resultat[0][0]][3]/@DesktopHeight
EndIf
EndIf
EndIf
$i += 1
WEnd
DllClose($dll)
EndIf
Return $resultat
EndFunc
; Déplacement d'une fenêtre d'un écran vers l'écran suivant
Func WinMoveToNextScreen($title="", $texte="")
; Récupération du handle la fenêtre
Local $handle = WinGetHandle($title, $texte)
If @error Then Return SetError(1)
; Vérif des résolutions
Local $res = getResolutions()
If Not IsArray($res) Or $res[0][0] < 2 Then Return SetError(2)
Local $screen = 0, $pos = WinGetPos($handle), $point[2] = [$pos[0]+$pos[2]/2, $pos[1]+$pos[3]/2]
; Trouver l'écran sur lequel est la fenêtre (on pointe le milieu)
For $i = 1 To $res[0][0]
If $res[$i][0] <= $point[0] And $point[0] <= $res[$i][0] + $res[$i][2] And $res[$i][1] <= $point[1] And $point[1] <= $res[$i][1] + $res[$i][3] Then
$screen = $i
ExitLoop
EndIf
Next
If $screen = 0 Then Return SetError(3)
; Calcul des ratios de la position/taille de la fenêtre par rapport à l'écran
Local $factors[4] = [($pos[0]-$res[$screen][0])/$res[$screen][2], ($pos[1]-$res[$screen][1])/$res[$screen][3], $pos[2]/$res[$screen][2], $pos[3]/$res[$screen][3]]
$nextscreen = $screen+1
If $nextscreen > $res[0][0] Then $nextscreen = 1
; Déplacement sur le nouvel écran en conservant les ratios
Local $move = WinMove($handle, "", $res[$nextscreen][2]*$factors[0]+$res[$nextscreen][0], $res[$nextscreen][3]*$factors[1]+$res[$nextscreen][1], $res[$nextscreen][2]*$factors[2], $res[$nextscreen][3]*$factors[3])
If $move = 0 Then Return SetError(4)
EndFunc
WinMoveToNextScreen("[ACTIVE]")
Dis moi ce que tu en penses et surtout si ça marche, à bientôt !