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

hidozo Messages postés 56 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 6 novembre 2010 - 6 juin 2008 à 18:18
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 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

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 juin 2008 à 22:42
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...
hidozo Messages postés 56 Date d'inscription samedi 24 mai 2008 Statut Membre Derniè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.

Cordialement

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