Capture unique ou séquencé d'une zone defini de l'écran
hidozo
Messages postés56Date d'inscriptionsamedi 24 mai 2008StatutMembreDernière intervention 6 novembre 2010
-
6 juin 2008 à 18:18
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
7 juin 2008 à 18:32
Bonjour,
En VBA, je cherche comment faire pour capturer de façon unique, manuelle ou bien aen rafale (automatique) une zone de mon écran.
cela me permettrait de capturer des photos d'un film.
je ne sais pas trop comment m'y prendre
Cordialement
hidozo
A voir également:
Capture unique ou séquencé d'une zone defini de l'écran
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 6 juin 2008 à 19:21
Salut
Tu peux t'inspirer de codes en VB6 qui traitent de la copie d'écran, par exemple <cette source>
Comme tu travailles en VBA sous Excel :
Charge le ZIP
Décompresse le fichier FRM que tu pourras ouvrir un NotePad, le code est dedans.
Cette source détecte quand il y a une image dans le Presse-Papier (suite à un "Impr Syst") --> Récupère l'image et la sauve en BMP.
L'action sur la touche "Impr Syst" capture tout l'écran.
C'est un début.
Voir aussi <cette source> ou toutes les autres simples.
En général, cherche parmi les sources en excluant les sources .Net qui parlent de "copie écran" ou "capture".
Si la source contient un fichier BAS, tu pourras l'inclure (copier coller) à ton VBA, elle sera compatible.
Si la source contient un fichier CLS, ce sera plus dur à intégrer.
Les API (fonctions du système) sont les mêmes en VBA qu'en VB6 (et autres) puisqu'elles appartiennent au système.
Exemple de base :
Mets une PictureBox sur une forme :
Ce code capturera tout l'écran, mais tu peux retrouver la taille de ta forme et l'utiliser à la place de "Screen.Width" et "Screen.Height"
Dans la partie déclaration :
Private Const ScrCopy As Long = &HCC0020
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
A faire au moment voulu (dans un CommandButton par exemple) :
Dim hDc As Long
Dim hWnd As Long
hWnd = GetDesktopWindow()
hDc = GetDC(hWnd)
BitBlt Picture1.hDc, 0, 0, Screen.Width / Screen.TwipsPerPixelX, _
Screen.Height / Screen.TwipsPerPixelY, hDc, 0, 0, ScrCopy
DoEvents
SavePicture Picture1.Image, "C:\Copie Ecran.bmp"
DoEvents
Pour la partie cyclique, voir les multiples messages du forum à propos des Timers sous VBA (Excel ou autre)
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
hidozo
Messages postés56Date d'inscriptionsamedi 24 mai 2008StatutMembreDernière intervention 6 novembre 2010 6 juin 2008 à 23:43
Bonsoir,
En fait ce que je veux c'est pouvoir capturer des photos d'un films, soit à l'unité, soit en rafale, c'est à dire espacé d'un laps de temps (à définir en fonction de l'étude).
Sous VBA, j'ai réussi à lire une vidéo avec Windowsmediaplayer. Les photos sont extraites du film sous un autre logiciel, mais je voulais tenter de tout faire en VBA.
Je recherche également un timer (avec la base temps à modifier : DMH) pour le coupler avec la vidéo. Timer s'arrête quand la vidéo s'arrête et reprends quand la vidéo reprend. Si vous avez une idée .... je suis preneur.
Parce que si mon projet fonctionne en VBA, après je tenterai d'en faiore (avec un autre langage) un vrai programme, mais là c'est une autre histoire.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 7 juin 2008 à 18:32
Re
En plus, j'ai oublié de te dire que la copie d'écran n'est parfois pas possible selon le lecteur que tu utilises.
Les couches DirectX sont parfois 'invisibles' depuis l'interface graphique.
Les Timers (exécution cyclique) sous VBA n'existent pas.
Il faut avoir recours aux APIs
De là à synchroniser son marche/arrêt sur des évènements liés à une autre application, il y a un monde.
Je pense que tu peux oublier VBA pour ce genre de tâche.
Et pourquoi ne pas fouiller parmi les logiciels spécialisés ?
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)