2013-05-08 1 views
2

J'ai une fenêtre sous forme de fenêtre qui est peinte par un autre processus. Si je tente de copier l'image de fenêtre à l'aide PrintWindow ou une copie de contexte de périphérique, seule ma fenêtre ci-dessous apparaît:Get Image peint sur la fenêtre

fenêtre avant qu'il ne soit peint par un autre processus:

enter image description here

fenêtre après sa peint:

enter code here

fenêtre que je reçois quand je fais PrintWindow ou BitBlt:

enter image description here

Est-il possible de lire le tirage au sort de la fenêtre de la fenêtre directement sans l'envoyer l'argument de la peinture? Puis-je le lire directement depuis la carte graphique?

+0

Voulez-vous faire une capture d'écran? –

+1

Vous devez montrer du code. Aussi qu'est-ce que vous entendez par * ... est peint par un autre processus *. * Si j'essaie de copier l'image de la fenêtre *, où? –

+2

Vous pouvez saisir l'écran en utilisant la méthode 'CopyFromScreen': http://stackoverflow.com/questions/362986/capture-the-screen-into-a-bitmap – Dmitry

Répondre

1

Si je suis correct, vous voulez copier une fenêtre rendue par un processus DirectX?

Vous pouvez le faire, mais vous devez comprendre que vous ne pouvez pas copier directement la mémoire de la fenêtre parce que la forme de Winows n'a pas votre image, il a seulement un espace réservé pour l'image rendue. Ce n'est qu'une illusion que l'image est rendue à l'intérieur de la forme. Ce que vous devez faire est de copier la mémoire de la carte graphique, mais malheureusement, je ne sais pas comment faire cela.

L'idée la plus simple est d'obtenir une capture d'écran de fenêtre comme alt + écran d'impression, supprimez la bordure et copiez cette image sur votre fenêtre.

Peut-être que cela aidera http://www.codeproject.com/Articles/274461/Very-fast-screen-capture-using-DirectX-in-Csharp

0

Dmitry a raison.
Vous ne pouvez faire une CopyFromScreen comme il le suggère:
Capture the Screen into a Bitmap
Vous pouvez modifier le code source pour créer un bitmap grand que votre fenêtre et copier uniquement cette partie de l'écran

4

DirectX brise les règles, vous ne pouvez pas PrintWindow() travail. L'utilisation de Graphics.CopyFromScreen() ne fonctionne pas non plus, il s'agit d'un bogue critique qui vous empêche de transmettre la bonne valeur de CopyPixelOperation. Celui qui a été abordé dans Windows 8 par Windows lui-même, vous ne pouvez pas encore compter dessus.

Vous aurez besoin de basculer vers BitBlt(). L'option critique est CopyPixelOperation.CaptureBlt afin que les superpositions vidéo soient incluses dans la copie. Vous trouverez le code requis dans this answer.

+0

Cette solution dans la réponse liée est génial !!! –