2009-01-05 6 views
3

Quelqu'un connaît un moyen de prendre de manière fiable un instantané d'une fenêtre WPF? L'API PrintWindow fonctionne bien pour les fenêtres win32 "standard" mais comme WPF utilise DirectX, PrintWindow ne parvient pas à capturer une image. Je pense que l'on aurait besoin de récupérer le tampon avant pour l'objet DirectX associé à la fenêtre, mais je ne suis pas sûr de savoir comment le faire.PrintWindow WPF/DirectX

Merci!

+0

Juste pour clarifier - je Je cherche une solution qui fonctionne comme PrintWindow - ie je devrais être capable de capturer la capture d'écran d'un autre processus avec juste le hwnd pour la fenêtre WPF. –

Répondre

3

Je ne suis pas sûr si c'est ce que vous voulez dire, et je ne suis pas sûr que je suis autorisé à créer un lien vers mon blog ou non, mais est this toute utilisation? Il utilise essentiellement un RenderTargetBitmap pour générer un fichier JPG. Vous pouvez l'utiliser pour "capturer" une fenêtre entière puis l'imprimer.

Si cela est contraire aux règles, une personne ne hésitez pas à supprimer :)

+0

Merci Steve. Cela ne marchera pas pour mon cas - je vais mettre à jour ma question parce que ce n'était pas clair. Fondamentalement, je veux être en mesure de capturer cette image avec un accès à la Hwnd et d'un autre processus. –

+0

Ah, désolé, aucune idée alors. J'ai fait des captures d'écran DirecX depuis l'application, mais jamais à distance. Ce code a été écrit à l'origine pour les captures d'écran à distance, mais il a utilisé un service WCF auto-hébergé, ce qui, je suppose, n'est pas bon pour vous? –

1

Cette méthode devrait vous aider à imprimer l'ensemble de WPF/XAML Fenêtre

private void PrintWindow(PrintDialog pdPrint, 
         System.Windows.Window wWin, 
         string sTitle, 
         System.Windows.Thickness? thMargin) 
    { 
     Grid drawing_area = new Grid(); 
     drawing_area.Width = pdPrint.PrintableAreaWidth; 
     drawing_area.Height = pdPrint.PrintableAreaHeight; 


     Viewbox view_box = new Viewbox(); 
     drawing_area.Children.Add(view_box); 
     view_box.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 
     view_box.VerticalAlignment = System.Windows.VerticalAlignment.Center; 

     if (thMargin == null) 
     { 
      view_box.Stretch = System.Windows.Media.Stretch.None; 
     } 
     else 
     { 

      view_box.Margin = thMargin.Value; 
      view_box.Stretch = System.Windows.Media.Stretch.Uniform; 
     } 


     VisualBrush vis_br = new VisualBrush(wWin); 


     System.Windows.Shapes.Rectangle win_rect = new System.Windows.Shapes.Rectangle(); 
     view_box.Child = win_rect; 
     win_rect.Width = wWin.Width; 
     win_rect.Height = wWin.Height; 
     win_rect.Fill = vis_br; 
     win_rect.Stroke = System.Windows.Media.Brushes.Black; 
     win_rect.BitmapEffect = new System.Windows.Media.Effects.DropShadowBitmapEffect(); 

     // Arrange to produce output. 
     Rect rect = new Rect(0, 0, pdPrint.PrintableAreaWidth, pdPrint.PrintableAreaHeight); 
     drawing_area.Arrange(rect); 

     // Print it. 
     pdPrint.PrintVisual(drawing_area, sTitle); 

    } 

Cordialement Sean Campbell

+0

Merci Sean mais cela ne fonctionnera pas, je dois être capable de capturer l'image d'un autre processus en utilisant seulement le HWND, je n'ai pas accès au "wWin" dans ce cas –