begin process at 2008 07 06 18:39:08
1 205 719 membres
282 nouveaux aujourd'hui
14 119 membres club

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é: 3 720 / 5 497

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

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
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

  • 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

Pub



Appels d'offres

WEB DESIGN
Budget : 1 000€
Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS