IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C# BitBlt & Co] Affichage du bureau dans une form


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut [C# BitBlt & Co] Affichage du bureau dans une form
    Bonjour,

    Je tente, pour le fun, de jouer avec la capture d'image.
    Je voudrais que ma form affiche la partie du bureau qui est juste en-dessous, en gros pour faire semblant à de la transparence quoi ...

    j'ai implémenté ces 3 fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            [DllImport("gdi32.dll")]
            static extern IntPtr CreateDC(string lpszDriver, string lpszDevice,
               string lpszOutput, IntPtr lpInitData);
     
            [DllImport("gdi32.dll")]
            static extern IntPtr DeleteDC(IntPtr hdc);
     
            [DllImport("gdi32.dll")]
            static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
    et dans mon évènement Paint j'ai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                IntPtr hdc = CreateDC("DISPLAY", null, null, IntPtr.Zero);
                Graphics g = e.Graphics;
                IntPtr dc = g.GetHdc();
                bool t = BitBlt(dc, 0, 0, this.Width, this.Height, hdc, 50, 50, SRCCOPY);
                g.ReleaseHdc(dc);
                DeleteDC(hdc);
    BitBlt capture pour le moment une zone fixe de l'ecran car si j'essaie
    un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool t = BitBlt(dc, 0, 0, this.Width, this.Height, hdc, this.Left, this.Top, SRCCOPY);
    et bien la form se capture elle même en fait...

    Quelle astuce utiliser pour pouvoir faire ça ?

    merci d'avance
    Ben

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Tu sais, quelques soit la manière dont tu captures l'écran si ta form est visible elle sera toujours sur la capture ... (du moins, avec les fonctions que je connais).
    Par contre si tu veux faire de la transparence en WindowsForms le seul moyen facile c'est d'utiliser la propriété TransparencyKey pour définir une couleur de transparence ... ou alors les LayeredWindows mais là c'est l'enfer (par contre en WPF c'est hyper simple )

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    à mon avis le problème est sur ta première ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IntPtr hdc = CreateDC("DISPLAY", null, null, IntPtr.Zero);
    Tu crées un DC alors qu'il faudrait plutôt obtenir celui qui existe déjà pour le bureau. A vue de nez je dirais que tu peux l'obtenir avec la fonction GetDC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("gdi32.dll")]
    static extern IntPtr GetDC(IntPtr hwnd);
    en lui passant le handle du bureau (NULL si j'ai bonne mémoire) tu devrais récupérer le DC du bureau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                IntPtr hdc = GetDC(IntPtr.Zero);
                Graphics g = e.Graphics;
                IntPtr dc = g.GetHdc();
                bool t = BitBlt(dc, 0, 0, this.Width, this.Height, hdc, 50, 50, SRCCOPY);
                g.ReleaseHdc(dc);
                DeleteDC(hdc);

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    j'ai dit des conneries en fait...
    - GetDC est dans user32 et non dans gdi32 (pas très logique je trouve, mais bon...)
    - le handle du bureau n'est pas NULL mais est obtenu par GetDesktopWindow (aussi dans user32.dll)

    et de toutes façons ça ne fonctionne que si le bureau est visible, sinon ça montre le contenu des fenêtres visibles

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par tomlev Voir le message
    à mon avis le problème est sur ta première ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IntPtr hdc = CreateDC("DISPLAY", null, null, IntPtr.Zero);
    Tu crées un DC alors qu'il faudrait plutôt obtenir celui qui existe déjà pour le bureau. A vue de nez je dirais que tu peux l'obtenir avec la fonction GetDC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("gdi32.dll")]
    static extern IntPtr GetDC(IntPtr hwnd);
    en lui passant le handle du bureau (NULL si j'ai bonne mémoire) tu devrais récupérer le DC du bureau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                IntPtr hdc = GetDC(IntPtr.Zero);
                Graphics g = e.Graphics;
                IntPtr dc = g.GetHdc();
                bool t = BitBlt(dc, 0, 0, this.Width, this.Height, hdc, 50, 50, SRCCOPY);
                g.ReleaseHdc(dc);
                DeleteDC(hdc);
    Correction, GetDC est dans user32.dll et non pas dans gdi32.dll ;-)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par ben_popcorn Voir le message
    Correction, GetDC est dans user32.dll et non pas dans gdi32.dll ;-)
    Je sais
    Citation Envoyé par tomlev Voir le message
    j'ai dit des conneries en fait...
    - GetDC est dans user32 et non dans gdi32 (pas très logique je trouve, mais bon...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. affichage un menu dans une forme
    Par OraNabiloun dans le forum Forms
    Réponses: 1
    Dernier message: 04/04/2011, 12h25
  2. ajuster l'affichage des bouton dans une forme large
    Par tvcinq dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 30/09/2010, 17h56
  3. Ordre d'affichage des control dans une form
    Par bipcpp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/12/2009, 20h08
  4. Affichage du bureau dans une DBImage
    Par Jean75 dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/06/2007, 21h33
  5. Affichage d'images dans une fenêtre
    Par tonycalv dans le forum MFC
    Réponses: 6
    Dernier message: 20/04/2005, 20h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo