déplacement fenêtre en mode etendu (2 écrans)

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
microtec
Niveau 1
Niveau 1
Messages : 2
Enregistré le : mar. 31 mai 2016 10:35
Status : Hors ligne

déplacement fenêtre en mode etendu (2 écrans)

#1

Message 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.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: déplacement fenêtre en mode etendu (2 écrans)

#2

Message par orax »

Eh... si ça marche avec Send (testé sur Windows 8).

Code : Tout sélectionner

Send("#+{RIGHT}")
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
microtec
Niveau 1
Niveau 1
Messages : 2
Enregistré le : mar. 31 mai 2016 10:35
Status : Hors ligne

Re: déplacement fenêtre en mode etendu (2 écrans)

#3

Message 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!
Avatar du membre
TomAijerrie
Niveau 5
Niveau 5
Messages : 192
Enregistré le : lun. 02 juin 2014 09:55
Localisation : Lyon
Status : Hors ligne

Re: déplacement fenêtre en mode etendu (2 écrans)

#4

Message par TomAijerrie »

winmove si tu connais le nom de la fenêtre
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: déplacement fenêtre en mode etendu (2 écrans)

#5

Message 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 !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Répondre