2009-07-07 3 views
5

Je sais que je ne devrais généralement pas modifier ces paramètres système, mais mon application utilise déjà des couleurs non standard et je n'ai aucune influence sur cela. J'aimerais pouvoir ajouter des contrôles .NET standard à certains endroits, mais leurs couleurs ne correspondent pas. Je voudrais avoir un hack qui remplacerait les couleurs du système pour cette application. Une chose plus importante à noter est que c'est une application .NET.Modification des couleurs du système pour une seule application (Windows, .NET)

Mon (incomplète) des idées à ce jour étaient:

  • Pour créer une bibliothèque User32.dll proxy avec remplacé GetSysColor, mais il serait très fastidieux (731 fonctions à réexpédier, 1 à remplacer) et Je ne sais pas comment forcer ma demande à utiliser cette copie particulière.
  • Pour intercepter en quelque sorte des invocations à GetSysColors (malheureusement, c'est quelque part dans le CLR, je pense).
  • Pour modifier en quelque sorte la classe .NET SystemColors (en mémoire? Est-ce possible?).

Avez-vous une idée, quelle est la meilleure (et complète) façon d'y parvenir?

+0

J'ai réussi à accrocher GetSysColor et GetSysColorBrush. Malheureusement, il ne suffit pas de colorer les contrôles, et je ne sais toujours pas pourquoi. – olpa

Répondre

2

Dans mes premiers jours, j'ai développé un programme qui a enregistré un message global crochet au propriétaire dessiner les frontières de la fenêtre - je pourrais thème toutes les fenêtres. Cela devrait être possible pour une seule application, aussi. Cependant, c'est pas une tâche simple.

Sinon, je ne pense pas que ce soit possible. Que diriez-vous d'utiliser des contrôles tiers contrôlables tels que Krypton Toolkit?

+0

En fait, j'utilise certains contrôles Divelements, mais ils ne fournissent pas de contrôles réguliers comme des boutons ou des barres de défilement. Je vais vérifier Krypton. Merci pour cette suggestion. Serait-il possible que vous m'envoyiez ce programme de coloration dont vous parlez? Je serais reconnaissant pour tous les détails supplémentaires. –

+0

Désolé, je ne peux pas vous envoyer la source de l'outil - je dois avoir écrit cela autour de 1992 à Borland Pascal. Les sources ont été perdues depuis longtemps ... –

+0

J'ai vérifié cela - Je peux intercepter l'événement WM_PAINT en utilisant des hooks système, mais ça ne me donne rien. Je peux le faire plus simple en remplaçant OnPaint dans mon code C#. Et je ne peux toujours pas changer de couleur en général. Peut-être que seules les frontières seraient possibles (connaissant le rectangle client), mais cela ne suffit pas. –

4

J'aimerais pouvoir ajouter des contrôles .NET standard à certains endroits, mais leurs couleurs ne correspondent pas. Je voudrais avoir un hack qui remplacerait les couleurs du système pour cette application.

C'est comme conduire un clou avec un marteau.

Plutôt que de copier les couleurs dans le système lui-même, ce que vous pouvez faire est hériter un nouveau contrôle de chaque contrôle de stock que vous souhaitez utiliser. Ainsi, au lieu d'un TextBox simple, vous héritez du contrôle TextBox stock pour créer votre propre ThemedTextBox. Vous configurez ce nouveau contrôle pour utiliser le modèle de couleurs de votre application par défaut, et comme est encore un TextBox en ce qui concerne la structure d'héritage, vous pouvez l'utiliser partout où vous utiliseriez une zone de texte normale, y compris dans le concepteur de WinForms.

+0

Malheureusement, dans le .NET, il n'est pas possible de changer les couleurs de la classe héritée. Je devrais faire tout le dessin à partir de zéro.Et même cela ne suffirait pas à cause de différents styles visuels possibles (par exemple XP vs Vista). –

+1

Bien sûr, vous pouvez changer les couleurs. Mettez à jour le constructeur de la classe héritée pour définir les propriétés appropriées. –

+2

Le problème est que dans WinFoms il n'y a pas de "propriétés appropriées". La classe de contrôle n'a que ForeColor et BackColor, mais ce n'est pas tout. Pour TextBox nous ne pouvons changer que la couleur du fond, mais pour ScrollBar nous ne pouvons rien changer. –

Questions connexes