2011-01-27 6 views
2

Est-ce que quelqu'un sait comment appliquer des effets à tout l'écran, en C# ou dans n'importe quel langage de programmation? Je suis surtout intéressé à rendre l'écran monochrome (spécifiquement vert-blanc au lieu de noir blanc).Créer des effets monochromes et plein écran en plein écran

Je connais une solution de carte graphique croisée est possible parce que je trouve un programme qui peut le faire: http://www.freedomscientific.com/products/lv/magic-bl-product-page.asp

Tout le monde sait comment accomplir quelque chose ce ou où chercher?

Merci!

+1

Qu'est-ce qui vous fait penser que le logiciel auquel vous vous êtes connecté est * multiplate-forme *? Tout ce que je peux voir est des références à diverses versions de Windows. – thkala

+1

Je suis corrigé. Je voulais dire que cela fonctionne sur différentes versions de fenêtres, cross plate-forme était très mal formulé. – Dyte

+1

Vous devrez peut-être créer un pilote ou appliquer 'Wide System Hooks' ... Ce ne sera pas simple spécialement avec du code managé. – fardjad

Répondre

2

Il n'y a pas d'API Windows facile pour modifier l'intégralité du contenu de l'écran. Mais cela pourrait être fait au niveau du pilote de périphérique.

Sinon, vous devez recourir à certaines astuces Windows API: placer une "fausse" fenêtre sur l'ensemble du bureau, en boucle: saisir tout le contenu de l'écran sans saisir le contenu de la fenêtre, faire votre traitement pour obtenir l'effet monochrome, puis affichez cela sur la fausse fenêtre. Oui, c'est hacky et lent, mais possible. Encore plus hacky, quand vous obtenez des clics de souris pour "traverser" la fausse fenêtre (beaucoup d'appels SetWindowsRgn). Donc, multiplateforme signifie ici utiliser GDI, bien que certaines anciennes API DirectDraw puissent fonctionner, dans ce cas, vous avez beaucoup plus de facilité avec les superpositions matérielles (et de meilleures performances). Bien que je ne sois pas sûr combien de cartes supportent réellement les superpositions de matériel, et si les nouvelles versions de Windows supportent les anciennes API DirectDraw. Une autre possibilité est que si la carte vidéo a une API C# ou C++ ou C, alors vous pouvez faire ce que vous voulez avec la carte sans écrire le code du pilote de périphérique.

Ensuite, il y a CUDA, mais je ne l'ai pas encore essayé. Je sais que c'est pour le traitement de flux sur les cartes nVidia, mais je me demande si cela pourrait vous permettre d'accéder facilement à la vidéo.

+0

Le niveau du pilote de périphérique que vous dites. Pourriez-vous me montrer où je peux trouver plus d'informations sur l'interaction avec cela? Ouais, je pensais aussi à la solution "fausse fenêtre", mais comme il n'y a pas moyen de faire une capture d'écran "sous" la fenêtre active, je devrais utiliser une boucle dans laquelle je cache la fenêtre active, prendre la photo et montrer encore une fois, ce qui causerait un horrible scintillement. Merci pour les autres suggestions et brainstorming! – Dyte

+0

Je n'ai jamais écrit un pilote de périphérique, je ne peux donc pas vous donner de véritable conseil à ce sujet.Pour la fenêtre "fausse" vacillante, il y a une astuce GDI, la fausse fenêtre a une opacité de 99%, alors vous utilisez BitBlt (capture d'écran basique) sans l'indicateur CAPTUREBLT. Cela provoque la capture d'écran de n'importe quelle fenêtre avec transparence. Bon pour manquer la fausse fenêtre, mauvais pour le contenu de la fenêtre réelle manquante. –

+0

J'ai entendu parler de cette solution de contournement. Mais cela fonctionne aussi sur Windows 7? Parce qu'après tout, ce n'est pas vraiment comme ça par conception? – Dyte

2

Pour aider les gens à l'avenir qui sont intéressés par ceci:

Ceci est possible avec le Magnification API's color effect method. Cela permet d'utiliser une matrice qui peut être appliquée à l'ensemble de l'écran.

NegativeScreen est un projet open source qui implémente la fonctionnalité que vous décrivez en C#. Malheureusement, cela ne fonctionne qu'avec les transformations affines, car l'API ne prend qu'une matrice augmentée plutôt qu'un délégué ou quelque chose du genre.