Capture d'ecran bureau en "background"

Résolu
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 - 25 févr. 2009 à 10:16
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 27 févr. 2009 à 10:58
Bonjour à tous,

Je suis actuellement en train de developper un programme (en c#, eh oui désolé pour ceux qui ne considère pas ca comme un "vrai" language :p) et il se trouve que je doive faire quelques appels à certaines fonctions Win32 (FindWindow, Enumwindows....) et c'est pourquoi je pense que ce forum est plus adapté a mon probleme.

Je cherche donc à faire une capture d'écran du bureau (je sais faire une capture d'écran normale, ou encore une capture d'ecran ciblée sur un hwnd mais la je veux vraiment une capture d'écran du bureau uniquement sans toutes les eventuelles fenetres ouvertes). J'aimerai si possible que cela soit fait en "background", c'est a dire que je n'ai pas a faire ShowWindow(hwnd, SW_HIDE) sur chaque fenetre puis ShowWindow(hwnd, SW_SHOW) pour les reafficher ensuite par exemple.

cela est-il réalisable? si oui, pourriez vous m'indiquer quelques pistes?

Merci d'avance,

RougailSaucisse!

5 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
26 févr. 2009 à 12:02
Salut, on t'aurait tout aussi bien répondu sur CSharpFR, si la réponse te convient je déplacerais le thread.

[ SuppressUnmanagedCodeSecurity ]
internal static class Win32
{
    [ StructLayout( LayoutKind.Sequential ) ]
    private struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }


    //[ DllImport( "user32.dll" ) ]
    //private static extern IntPtr GetDesktopWindow( );


    [ DllImport( "user32.dll" ) ]
    [ return: MarshalAs( UnmanagedType.Bool ) ]
    private static extern bool PrintWindow(
        IntPtr hWnd, IntPtr hDCBlt, uint nFlags );


    [ DllImport( "user32.dll", SetLastError = true ) ]
    [ return: MarshalAs( UnmanagedType.Bool ) ]
    private static extern bool GetWindowRect(
        IntPtr hWnd, out RECT lpRect );


    [ DllImport( "user32.dll",        CharSet CharSet.Unicode, SetLastError true ) ]
    private static extern IntPtr FindWindow(
        string lpClassName, string lpWindowName );


    [ DllImport( "user32.dll",        CharSet CharSet.Unicode, SetLastError true ) ]
    private static extern IntPtr FindWindowEx( IntPtr hwndParent,
        IntPtr hwndChildAfter, string lpszClass, string lpszWindow );


    private static IntPtr FindDesktopWindow( )
    {
        IntPtr hWnd = FindWindow( "Progman", "Program Manager" );
        if ( hWnd != IntPtr.Zero )
        {
            hWnd = FindWindowEx( hWnd,
                IntPtr.Zero, "SHELLDLL_DefView", null );
            if ( hWnd != IntPtr.Zero )
            {
                hWnd = FindWindowEx( hWnd,
                    IntPtr.Zero, "SysListView32", null );
            }
        }


        return hWnd;
    }


    public static Bitmap GetTaskBarBitmap( )
    {
        Bitmap bmp = null;
        IntPtr hWnd = FindWindow( "Shell_TrayWnd", null );
        if ( hWnd != IntPtr.Zero )
        {
            RECT rect;
            if ( GetWindowRect( hWnd, out rect ) )
            {
                int width = rect.right - rect.left;
                int height = rect.bottom - rect.top;
                bmp = new Bitmap( width, height,
                    PixelFormat.Format24bppRgb ); // Verifier Screen BPP.
                using ( Graphics g = Graphics.FromImage( bmp ) )
                {
                    IntPtr hDC = g.GetHdc( );
                    PrintWindow( hWnd, hDC, 0 );
                    g.ReleaseHdc( hDC );
                }
            }
        }


        return bmp;
    }


    public static Bitmap GetDesktopBitmap( )
    {
        Bitmap bmp = null;
        IntPtr hWnd = FindDesktopWindow( );
        if ( hWnd != IntPtr.Zero )
        {
            RECT rect;
            if ( GetWindowRect( hWnd, out rect ) )
            {
                int width = rect.right - rect.left;
                int height = rect.bottom - rect.top;
                bmp = new Bitmap( width, height,
                    PixelFormat.Format24bppRgb ); // Verifier Screen BPP.
                using ( Graphics g = Graphics.FromImage( bmp ) )
                {
                    IntPtr hDC = g.GetHdc( );
                    PrintWindow( hWnd, hDC, 0 );
                    g.ReleaseHdc( hDC );
                }
            }
        }


        return bmp;
    }
}
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
25 févr. 2009 à 12:43
C'est-à-dire que le bureau est considéré comme la fenêtre de base sur lequel sont peintes toutes les autres fenêtres; par conséquent, si une application a une fenêtre active, le "background" n'existe tout simplement pas puisque cette fenêtre peint par-dessus.
Sous réserve d'erreur de ma part...
De toutes manières, pourquoi veux-tu faire cette capture?
0
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
25 févr. 2009 à 13:35
je souhaite faire une appli qui simule des bureaux multiples, un peu comme sous linux. cela fonctionne deja plus ou moins mais j'aimerai au chargement de l'application qu'il me prenne une screnshot du bureau afin d'avoir un apercu. je sais pas si c'est clair mais bon.
0
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
27 févr. 2009 à 02:41
Bonjour et merci beaucoup.

Cette solution me convient parfaitement, j'ai exactement le résultat attendu. Merci pour ces précieuses infos.
Je commencais a croire que cela n'etait pas possible, apres avoir testé les fonctions GetDesktopWindow(), Paintdesktop() j'avais en retour ou une image de tout l'ecran avec les fenetres ou une image toute noir en utilisant Paintdesktop().
quoiqu'il en soit un grand merci et j'espere que cette source pourra profiter a d'autres personnes eventuellement.

RougailSaucisse
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
27 févr. 2009 à 10:58
Hop je déplace sur csharpfr, le code managé ça leur file des boutons sur cppfrance
0
Rejoignez-nous