Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

FAIRE UN APERÇU DES APPLIS / FICHIERS OUVERTS DANS UNE FORM AVEC L'API PRINTWINDOW


Information sur la source

Catégorie :API Classé sous : screen, printwindow, aperçu Niveau : Débutant Date de création : 08/03/2007 Vu / téléchargé: 4 179 / 5 552

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Histoire de m'occuper, j'ai fait ce bout de code qui liste les fichiers et les applis ouverts dans une ListBox, et lors du choix de l'item, une autre Form s'ouvre avec l'aperçu dedans, grâce à l'API PrintWindow.

En fait je me baladais sur DelphiFR.com et j'ai vu ce titre, alors je l'ai fait en VB  ;)
 

Source

  • Public Sub AddWindowsName(oForm As Form, oControl As String)
  • Dim Handle As Long
  • Dim NewHandle As Long
  • Dim i As Long
  • Dim sNameWindow As String
  • ' Handle de la Form qui appelle la méthode
  • Handle = oForm.hWnd
  • ' Handle de la Form qui appelle la méthode en propriété
  • HandleForm = oForm.hWnd
  • ' Passage de la valeur du Handle
  • NewHandle = Handle
  • On Local Error Resume Next
  • ' Recherche des handle + affichage de la liste dans le contrôle mis en paramètre
  • For i = 2 To 3
  • Do
  • Handle = NewHandle
  • ' And IsIconic(Handle)
  • If IsWindow(Handle) = 1 And (IsWindowVisible(Handle)) Then
  • If Not Not (IsIconic(Handle)) Then
  • sNameWindow = String(100, Chr$(0))
  • GetWindowText Handle, sNameWindow, 100
  • sNameWindow = Left$(sNameWindow, InStr(sNameWindow, Chr$(0)) - 1)
  • If sNameWindow <> vbNullString Then
  • oForm.Controls(oControl).AddItem sNameWindow
  • Debug.Print "~" & CStr(Handle) & "~" & sNameWindow & "~"
  • mcolWindows.Add CStr(Handle), sNameWindow
  • End If
  • End If
  • End If
  • NewHandle = GetNextWindow(Handle, i)
  • Loop Until Handle = NewHandle
  • Next i
  • End Sub
  • Public Sub GenerateWindow(ByVal sName As String, ByVal oFormPrint As Form)
  • ' obligé d'afficher la fenêtre voulue sinon elle n'apparait pas dans la form :$
  • Load oFormPrint
  • ShowWindow CLng(mcolWindows.Item(sName)), SW_SHOWNORMAL
  • oFormPrint.Caption = sName
  • oFormPrint.AutoRedraw = True
  • PrintWindow mcolWindows.Item(sName), oFormPrint.hDC, 0
  • ShowWindow CLng(mcolWindows.Item(sName)), SW_SHOWMINIMIZED
  • oFormPrint.Show
  • End Sub
Public Sub AddWindowsName(oForm As Form, oControl As String)
    Dim Handle      As Long
    Dim NewHandle   As Long
    Dim i           As Long
    Dim sNameWindow As String
    
' Handle de la Form qui appelle la méthode
    Handle = oForm.hWnd
    
' Handle de la Form qui appelle la méthode en propriété
    HandleForm = oForm.hWnd
    
' Passage de la valeur du Handle
    NewHandle = Handle
    
    On Local Error Resume Next
' Recherche des handle + affichage de la liste dans le contrôle mis en paramètre
    For i = 2 To 3
        Do
            Handle = NewHandle
            ' And IsIconic(Handle)
            If IsWindow(Handle) = 1 And (IsWindowVisible(Handle)) Then
                If Not Not (IsIconic(Handle)) Then
                    sNameWindow = String(100, Chr$(0))
                    GetWindowText Handle, sNameWindow, 100
                    sNameWindow = Left$(sNameWindow, InStr(sNameWindow, Chr$(0)) - 1)
                    
                    If sNameWindow <> vbNullString Then
                        oForm.Controls(oControl).AddItem sNameWindow
                        Debug.Print "~" & CStr(Handle) & "~" & sNameWindow & "~"
                        mcolWindows.Add CStr(Handle), sNameWindow
                    End If
                End If
            End If
            NewHandle = GetNextWindow(Handle, i)
        Loop Until Handle = NewHandle
    Next i
End Sub

Public Sub GenerateWindow(ByVal sName As String, ByVal oFormPrint As Form)
    
    ' obligé d'afficher la fenêtre voulue sinon elle n'apparait pas dans la form :$
    Load oFormPrint
    ShowWindow CLng(mcolWindows.Item(sName)), SW_SHOWNORMAL
    oFormPrint.Caption = sName
    oFormPrint.AutoRedraw = True
    PrintWindow mcolWindows.Item(sName), oFormPrint.hDC, 0
    ShowWindow CLng(mcolWindows.Item(sName)), SW_SHOWMINIMIZED
    oFormPrint.Show

End Sub

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de PCPT le 08/03/2007 07:39:15 administrateur CS

salut mortalino,
pas regardé le code (plus tard ce soir).
la fenêtre listant se remet-elle à jour? de manière à ce que la capture soit capturée (miroir en face du miroir)?
ta source peut être intéressante si ce listing est envoyé sur un PC du LAN, avec une compression jpg lors de la sélection distante...
++ ;)

signaler à un administrateur
Commentaire de MadM@tt le 08/03/2007 11:10:20

Salut mortalino,
l'idée est pas mal, j'avais aussi cherché la dedans mais on est obligé d'afficher la fenetre cible pour pouvoir en faire une capture, ce qui n'est pas pratique... Si quelqu'un a une idée pour contourner ça ?
Sous vista y'a les aperçus des fenetres quand elles sont réduites, mais c'est peut etre pas le meme fonctionnement que XP à ce niveau

Sinon c'est super pratique d'avoir fait ça avec une classe

signaler à un administrateur
Commentaire de PCPT le 08/03/2007 21:42:28 administrateur CS

re,
après lecture du code, c'est commenté, clair et intuitif. très bien.
quelques points tout de même :

*nommer "o"Var pour objet (form ou autre), ok. mais pourquoi faire de même avec une string?
*do loop ok. mais pourquoi for i=2 to 3? (je vois bien le param de GetNextWindow mais pourquoi?)
*résultat sur la form, toujours ok. mais si on veut afficher en picturebox? ta classe doit être réutilisable au mieux, un simple hDC devrait être en argument. au dev la responsabilité d'afficher sa form ou son objet avant
*tu ajoutes en collection, à la destruction un set nothing ne suffit pas. ici des chaînes donc pas trop grave mais il faut virer chaque item.

et le point critique : le listing n'est pas correct chez moi. 2vb (ide), ton projet en cours, 2 explorer, csms, foxmail et cette page, seul FF est listé :$

signaler à un administrateur
Commentaire de mortalino le 08/03/2007 22:41:29

Salut,

MadM@tt : Oui, c'est dommage de devoir afficher la fenêtre, mais avec xp, si la fenêtre est iconisée, c'est ça qui se dessine, hélas ! Je vais voir si effectivement il n'y a pas de possibilités autres..

PCPT : Non, tu as raison, la fenêtre ne se met pas à jour, mais j'ai une idée qui me trotte dans la tête. (et avec un de tes snippets..) ;)

Pour la variable oVar c'est (je pense que tu parles du oControl As String) parce que je voulais directement récupérer le nom du controle par .. As Control mais en mettant listbox en paramètre ça ne me récupère que le .Text de sélectionné. J'ai omis de le modifier.

Do loop, car dans une source que j'ai trouvé, il faisait 2 boucles. Si avec une ça suffit, je le modifierai.

Ok pour le hDc en param, je le ferai.

Pour la collection, il faut donc faire une boucle pour faire un Remove sur tous les Items ?

Aie Aie Aie pour le point critique, chez moi, moins de problème (cf. mon screen) seul souci : ton CSMS, il n'est pas trouvé dans la liste  :$
Je vais refaire des essais

Merci pour vos comms ;)
@++

signaler à un administrateur
Commentaire de apxa le 09/03/2007 20:36:54

Salut,
Est ce que ton code pourrais géré des applis qui seraient non visible à l'ecran (en mémoire) ?

Have Fun

signaler à un administrateur
Commentaire de mortalino le 10/03/2007 12:22:50

Salut,

non car j'utilise la vérification (dans la classe) par IsWindowVisible (api). Il te suffit de modifier le paramètre, mais cela risque de poser problème avec certains processus ayant un handle

signaler à un administrateur
Commentaire de apxa le 10/03/2007 13:23:14

Salut,
En Effet j'en ai fait un aussi basé sur les differents moyens de faire des captures par handle (notament pour des pages web) via le composant webbrowser, picturebox et handle mais pour certaines url mais sur certaine url je suis faussé par du js lost.focus

Have Fun.

signaler à un administrateur
Commentaire de moustachu le 12/03/2007 08:40:42

Bonjour,

C'est sympa comme source. Sous vista je ne sais pas comment cela fonctionne mais sous XP, je sais qu'il existe des programmes qui montre la miniature de la fenêtre lorsqu'elle est réduite. Elle n'est disponible que lorsque la fenêtre a été affichée.

Moustachu

signaler à un administrateur
Commentaire de MadM@tt le 12/03/2007 20:48:29

Salut Moustachu, sous XP c'est possible ? ça m'interesse, t'aurais pas le nom du logiciel (ou meme une idée de la technique utilisée héhé ^^ ?) Merci

signaler à un administrateur
Commentaire de apxa le 12/03/2007 21:39:53

Salut,
En fait le problème est quand la fenetre est caché voir en mémoire

Pour vous aiguillez, c'est possible avec les API
GetObjectAPI, CreateCompatibleDC, CreateDIBSection, SelectObject, GetDesktopWindow, ReleaseDC, BitBlt, DeleteDC, CopyMemory, ijlWrite (pour le jpg)

Après le problème c'est pour le handle, dans mes recherches le handle s'avère être un webbrowser.
Donc déjà c'est la merde (pour ce qui connaissent bien ce composant).
Première merde rencontré handle non existant (remedié par une copie en mémoire dans un picturebox)
Deuxième merde rencontré la fonction js document.focus d'une page web qui renvois une capture vide.

Je n'ai pas le temps de revoir cela mais dès que j'aurais quelque chose de nouveau je vous le ferais savoir.

Sinon y a en .net le composant webbrowser qui gère la capture en image mais ce qui m'interresse c'est une solution vb6.

Have Fun

signaler à un administrateur
Commentaire de moustachu le 13/03/2007 00:43:46

Madm@tt> Je suppose qu'il s'agit d'effectuer une copie d'écran de la fenêtre avant qu'elle ne se réduise (en interceptant le message de réduction de la fenêtre je suppose). Mais bon, tu ne vas pas voit la fenêtre s'actualiser.

Ensuite, à la place d'afficher le tooltip habituel, tu affiches l'image de la fenêtre. Bon je ne sais pas comment faire mais ça doit être une histoire de subclassing...

Le logiciel c'est Visual Task Tip. Ca m'intéresse de savoir comment ça marche exactement si tu trouves..

++
Moustachu

signaler à un administrateur
Commentaire de mortalino le 02/07/2008 23:38:49

Pour les admins :

comment est-il possible que mon code soit + téléchargé que vu ???
Vu / téléchargé: 3 705 / 5 497

(suis curieux) :)

++

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Lancer Media player en full screen ? [ par Webmineur ] Salut,j'aimerai savoir:-comment lancer Media player en full screen.-connaitre la frequence du processeur-connaitre la quantité de Ram-savoir si une dl Screen Saver sous win 2000 [ par tjp88 ] problème avec windows 2000, mon screen saver qui affiche un simple formulaire, reste en taille réduit en bas a droite de l'ecran, et ne s'affiche pas Aucun aperçu des methodes d'un object [ par Timide ] Lorsque je declare un variable Ole je n'ai pas la liste de ses methodes apres le point de celle ciPouvez vous m'eclairez Timide Aperçu d'un fichier msg [ par Gbrissot ] Bonjour,dans une application je voudrais faire un aperçu rapide du contenu d'un message enregistrer à partir d'Outlook avec l'option "Enregistrer au f Comment inserer un aperçu dans une form ?? [ par Galereman ] Salut je cherche a inserer l'apercu d'un fichier rtf dans une form.J'ai essayer avec la methode printpreview mais ca ouvre une nouvelle fenetre propos [8d]cree un screen mate en visual basic [ par morganno ] salutje chercher une personne qui aurait le code d'un screen mate ou un screen mate fait. merci @++ Full screen sous access [ par moebius ] Existe t'il un moyen d'afficher un formulaire en plein écran (autre chose que la commande DoCmd.Maximize)Merci Quelqu'un sait il comment faire une aperçu avant impression [ par eltaris ] Ca m'interresserait beaucoupmerci Résolution écran...MARCHE PO Screen.Height !! [ par ghiscool ] Je cherches à avoir la résolution actuelle de mon écran pour pouvoir positionner au mieux mes formulaires, notamment lors des changements de résolutio Aperçu rapide (Quickview) [ par Vow ] Bonjour.J'ai lu que l'on pouvait voir toutes les fonctions incluses dans une DLL en utilisant l'"aperçu rapide" (QuickView).J'aurais voulu savoir si Q


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.