Capture unique ou séquencé d'une zone defini de l'écran

Signaler
Messages postés
56
Date d'inscription
samedi 24 mai 2008
Statut
Membre
Dernière intervention
6 novembre 2010
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
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

4 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
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)
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Bonjour jack,

Il va à mon amis rencontrer quelques petits problèmes avec VBA pour ne récupérer qu'un rectangle !

Pas de PictureBox, pas de Ipicture, pas de StdPicture...
La chose restera possible, mais compliquée...
Messages postés
56
Date d'inscription
samedi 24 mai 2008
Statut
Membre
Dernière intervention
6 novembre 2010

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.

Cordialement

Hidozo
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
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)