Page 1 sur 1
[R] Capture avec double écran
Posté : mar. 11 août 2009 14:46
par scorp84
Bonjour,
Je me permets de vous solliciter de nouveau après avoir cherché en vain la solution sur le forum ou chez notre ami Google.
Nous utilisons au travail un progiciel qui génère pas mal de bugs et je cherche à développer un script qui me permette au clic sur un raccourci dans la barre de lancement rapide de pouvoir m'envoyer par mail la capture écran.
Jusque là, pas de problème avec la fonction "_ScreenCapture_Capture" et "_INetSmtpMailCom".
Par contre là où je rencontre un problème c'est que la plupart des postes sont en
double écran et la fonction "_ScreenCapture_Capture" ne permet pas de
définir quel est l'écran à capturer.
J'ai essayer d'additionner la taille écran 2*1024 et 2*768 mais cela ne fonctionne pas.
J'ai essayer de chercher dans l'aide d'Autoit mais je n'ai pas trouvé comment définir s'il y a un double écran et si oui, lui indiquer le moniteur à capturer.
En espérant avoir été assez clair
Merci d'avance pour votre aide.
Amicalement.
BM
Re: [..] Capture avec double écran
Posté : mar. 11 août 2009 15:26
par Iste
Ya surement une solution pour le dualview, mais juste au cas ou, ou en attendant, tu peux aussi simuler l'appuis de la touche PrtSc, lancer paint, coller et enregistrer ^^'
Re: [..] Capture avec double écran
Posté : mar. 11 août 2009 16:18
par scorp84
Bonjour,
J'ai essayé d'utiliser la fonction Send("{PRINTSCREEN}") pour faire la capture écran mais là où j'ai pêché, c'est pour enregistrer le contenu du presse papier en tant qu'image.
J'ai utilisé ClipGet() mais ça ne doit pas être la bonne fonction car je n'obtiens rien dans le presse papier alors que quand je copie du texte, cela fonctionne.
Et le deuxième souci est qu'avec PRINTSCREEN, j'obtiens une image très grande alors que je préférerai en obtenir une de chaque écran.
Mais bon, si quelqu'un connait un moyen avec PRINTSCREEN, je suis preneur
Merci d'avance.
Amicalement.
BM
Re: [..] Capture avec double écran
Posté : mar. 11 août 2009 21:53
par Tlem
J'ai trouvé deux liens intéressants :
-
http://www.autoitscript.com/forum/index ... t&p=482883
-
http://www.autoitscript.com/forum/index ... t&p=146011
Le dernier lien fait appel à une dll spécifique (a voir). Le lien de la dll est mort, mais on peut la trouver ici :
http://www.autoitscript.com/forum/index ... t&p=340910
Bon courage.

Re: [..] Capture avec double écran
Posté : mar. 11 août 2009 22:52
par scorp84
Bonsoir,
Une fois de plus un grand merci pour votre aide
Je regarde ça demain et vous tiens au courant de ce que j'aurai réussi à faire.
Amicalement.
BM
Re: [..] Capture avec double écran
Posté : mer. 12 août 2009 14:25
par scorp84
Bonjour,
J'ai essayé les 2 pistes.
En premier, celle avec la DLL "captdll.dll" :
Code : Tout sélectionner
DllCall("captdll.dll", "int", "CaptureRegion", "str", "dump.jpg", "int", 0, "int", 0, "int", (@DesktopWidth*2), "int", @DesktopHeight, "int", 100)
Elle fonctionne bien mais me fait la même chose que Send("{PRINTSCREEN}"). C'est à dire qu'elle me fait une seule image de 2048 x 768 avec les 2 écrans.
Ensuite j'ai essayé "Ctrl+printscreen" et "Alt+printscreen" du second exemple. Le premier capture les 2 écrans et le second capture la fenêtre active (j'aurai encore appris quelque chose
Il me faudrait donc arriver à soit découper l'image en 2048 en 2, soit arriver à enregistrer en tant qu'image le presse papier après avoir envoyé l'ordre "Alt+printscreen".
Je vais chercher sur le forum et sur Internet voir si je trouve comment faire.
Si je trouve, je mettrai ce que j'ai trouvé.
Merci encore pour votre aide.
Amicalement.
BM
Re: [..] Capture avec double écran
Posté : mer. 12 août 2009 18:24
par orax
Je suppose que vous n'aviez pas laissé "(@DesktopWidth*2)" dans votre code ; parce que j'ai l'impression que ça prendra les 2 écrans dans ce cas.
Autre chose, j'avais vu ça :
http://msdn.microsoft.com/en-us/library ... 85%29.aspx, et d'après ce que je vois il faudrait modifier un peu la fonction _ScreenCapture_Capture pour capturer l'écran que l'on souhaite. Mais évidemment, vu que je ne peux pas tester, ce n'est peut-être pas une bonne piste...
Re: [..] Capture avec double écran
Posté : mer. 12 août 2009 19:24
par scorp84
Bonsoir,
Si au départ j'avais laissé @DesktopWidth*2 mais en fait sur l'image il y avait l'écran principal et le reste était noir, du coup, je l'avais enlevé.
Merci pour cette autre piste. Je vais étudier ça demain et vous tiendrai au courant.
Savez vous s'il est possible de transformer l'image qui est dans le presse-papier après le Send("{PRINTSCREEN}") en un fichier ?
J'ai cherché mais je n'ai pas réussi à trouver la solution.
Merci encore à tous pour votre aide très précieuse
Amicalement.
BM
Re: [..] Capture avec double écran
Posté : mer. 12 août 2009 19:33
par Iste
Apres avoir galéré pour y arriver seul, j'ai regardé sur le fofo anglais, et tadaaaa
http://www.autoitscript.com/forum/index ... ntry671709Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#Include <GDIPlus.au3>
#include <ClipBoard.au3>
#include <ScreenCapture.au3>
Send("{PRINTSCREEN}")
$hGUI=GUICreate("WW")
_ClipBoard_Open ($hGUI)
$fred=ClipGet()
if @error = 2 Then
$hBitmap=_ClipBoard_GetData ($CF_BITMAP )
_ScreenCapture_SaveImage(@ScriptDir & '\Testt.bmp', $hBitmap)
EndIf
Exit
testé et fonctionel, avec un écran du moins ^^
Re: [..] Capture avec double écran
Posté : jeu. 13 août 2009 09:26
par scorp84
Bonjour,
Vous êtes trop forts
Cette dernière piste marche nickel pour un écran. Je me suis permis de modifier l'extension de BMP à GIF car avec le double écran, le poids de l'image était de 4.6 Mo alors qu'en GIF elle est de 100 Ko (ce qui est mieux pour envoyer par mail
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#Include <GDIPlus.au3>
#include <ClipBoard.au3>
#include <ScreenCapture.au3>
Send("{PRINTSCREEN}")
$hGUI=GUICreate("WW")
_ClipBoard_Open ($hGUI)
$fred=ClipGet()
if @error = 2 Then
$hBitmap=_ClipBoard_GetData ($CF_BITMAP )
_ScreenCapture_SaveImage(@ScriptDir & '\Testt[b].gif[/b]', $hBitmap)
EndIf
Exit
Il me reste à explorer la piste de Orax pour définir l'écran et le tour est joué.
Merci encore à tous pour votre aide.
Amicalement.
BM
Re: [..] Capture avec double écran
Posté : jeu. 13 août 2009 10:53
par Tlem
Pour le format, je vous conseil plutôt PNG.
C'est le double du GIF, mail la définition est supérieure.

Re: [..] Capture avec double écran
Posté : ven. 14 août 2009 23:41
par scorp84
Bonsoir,
Merci pour ce nouveau conseil
Voici de manière bien modeste mon script qui me permet de faire une capture écran à l'exécution du script et de :
- la stocker sur le poste client dans le répertoire c:\BUGS
- l'envoyer par mail en PJ avec un mini rapport (date, heure, nom machine, nom utilisateur, ...)
La fonction de capture écran découle des conseils de ce fil et la fonction d'envoi du mail a été trouvé dans ce forum (
http://www.autoitscript.fr/forum/viewto ... =20&t=822)).
Elle est bien sûr perfectible mais elle fonctionne et peut peut être servir à d'autres.
► Afficher le texte
Code : Tout sélectionner
; SCRIPT
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <file.au3>
#include <Date.au3>
#include <GUIConstantsEx.au3>
#Include <GDIPlus.au3>
#include <ClipBoard.au3>
#include <ScreenCapture.au3>
; Création répertoire bugs si n'existe pas
$rep_bug="c:\BUGS"
$test= DirGetSize ($rep_bug)
if $test==-1 Then
DirCreate($rep_bug)
EndIf
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; Créé le nom du fichier
$local_jour = @YEAR & "_" & @MON & "_" & @MDAY
$local_heure = @HOUR & "_" & @MIN & "_" & @SEC
$bug_img = @ComputerName & "_" & $local_jour & "_" & $local_heure
$bug_img = StringRegExpReplace($bug_img, " ", "") & ".png"
$bug_img = $rep_bug & "\" & $bug_img
Send("{PRINTSCREEN}")
$hGUI=GUICreate("WW")
_ClipBoard_Open ($hGUI)
$presse_papier=ClipGet()
if @error = 2 Then
$hBitmap=_ClipBoard_GetData ($CF_BITMAP)
_ScreenCapture_SaveImage($bug_img, $hBitmap)
EndIf
$log_txt="BUGS SUR " & @ComputerName
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; ENVOI RAPPORT EXECUTION PAR MAIL
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; Includes nécessaires : #include <file.au3>, #include <GuiConstantsEx.au3> et #include <Date.au3>
$s_Subject = "AUTOIT - RAPPORT DE BUG SUR : " & @ComputerName
$as_Body = "" & @CRLF
$as_Body = $as_Body & "RAPPORT D'EXECUTION DE SCRIPT" & @CRLF
$as_Body = $as_Body & @CRLF
$tCur = _Date_Time_GetLocalTime()
$as_Body = $as_Body & "Date :" & _Date_Time_SystemTimeToDateTimeStr($tCur) & @CRLF
$as_Body = $as_Body & @CRLF
$as_Body = $as_Body & "Script : " & @ScriptName & @CRLF
$as_Body = $as_Body & @CRLF
$as_Body = $as_Body & "Nom machine : " & @ComputerName & @CRLF
$as_Body = $as_Body & @CRLF
$as_Body = $as_Body & "Nom utilisateur : " & @UserName & @CRLF
$as_Body = $as_Body & @CRLF
$as_Body = $as_Body & "IP machine : " & @IPAddress1 & @CRLF
$as_Body = $as_Body & @CRLF
$as_Body = $as_Body & "Système d'exploitation : " & @OSVersion & @CRLF
$as_Body = $as_Body & @CRLF
$as_Body = $as_Body & "Rapport : " & @CRLF
$as_Body = $as_Body & $log_txt & @CRLF
$s_SmtpServer = "xxx" ; Serveur SMTP
$s_FromName = "xxx" ; Nom expéditeur
$s_FromAddress = "xxx" ; Mail expéditeur
$s_ToAddress = "xxx" ; Destinataire
;$s_AttachFiles = $log_PJ ; Pièce jointe (à laisser vide si pas de PJ)
$s_AttachFiles = $bug_img ; Pièce jointe (à laisser vide si pas de PJ)
$s_CcAddress = "" ; Mail de copie (à laisser vide si non nécessaire)
$s_BccAddress = "" ; Mail de copie invisible (à laisser vide si non nécessaire)
$s_Username = "xxx" ; Login compte mail
$s_Password = "xxx" ; Mot de passe mail
$IPPort = 465 ; Port SMTP
$ssl = 1 ; Mettre 1 si envoi en SSL, sinon 0
Global $oMyRet[2]
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
$rc = _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body, $s_AttachFiles, $s_CcAddress, $s_BccAddress, $s_Username, $s_Password, $IPPort, $ssl)
If @error Then
MsgBox(0, "Error sending message", "Error code:" & @error & " Rc:" & $rc)
EndIf
; FONCTIONS
Func IsActive($handle)
If BitAnd( WinGetState($handle), 8 ) Then
Return 1
Else
Return 0
EndIf
EndFunc
Func _ProcessGetName($i_PID)
If Not ProcessExists($i_PID) Then
SetError(1)
Return ''
EndIf
Local $a_Processes = ProcessList()
If Not @error Then
For $i = 1 To $a_Processes[0][0]
If $a_Processes[$i][1] = $i_PID Then Return $a_Processes[$i][0]
Next
EndIf
SetError(1)
Return ''
EndFunc
Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Username = "", $s_Password = "",$IPPort=25, $ssl=0)
$objEmail = ObjCreate("CDO.Message")
$objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
$objEmail.To = $s_ToAddress
Local $i_Error = 0
Local $i_Error_desciption = ""
If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
$objEmail.Subject = $s_Subject
If StringInStr($as_Body,"<") and StringInStr($as_Body,">") Then
$objEmail.HTMLBody = $as_Body
Else
$objEmail.Textbody = $as_Body & @CRLF
EndIf
If $s_AttachFiles <> "" Then
Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
For $x = 1 To $S_Files2Attach[0]
$S_Files2Attach[$x] = _PathFull ($S_Files2Attach[$x])
If FileExists($S_Files2Attach[$x]) Then
$objEmail.AddAttachment ($S_Files2Attach[$x])
Else
$i_Error_desciption = $i_Error_desciption & @lf & 'File not found to attach: ' & $S_Files2Attach[$x]
SetError(1)
return 0
EndIf
Next
EndIf
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
;Authenticated SMTP
If $s_Username <> "" Then
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
EndIf
If $Ssl Then
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
EndIf
;Update settings
$objEmail.Configuration.Fields.Update
; Sent the Message
$objEmail.Send
if @error then
SetError(2)
return $oMyRet[1]
EndIf
EndFunc ;==>_INetSmtpMailCom
;
;
; Com Error Handler
Func MyErrFunc()
$HexNumber = Hex($oMyError.number, 8)
$oMyRet[0] = $HexNumber
$oMyRet[1] = StringStripWS($oMyError.description,3)
ConsoleWrite("### COM Error ! Number: " & $HexNumber & " ScriptLine: " & $oMyError.scriptline & " Description:" & $oMyRet[1] & @LF)
SetError(1); something to check for when this function returns
Return
EndFunc ;==>MyErrFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Exit
Merci beaucoup à tous ceux qui ont bien voulu prendre du temps pour m'aider pour ce problème.
Amicalement.
Bertrand