Problème avec l'API SetSysColors

bob94700 Messages postés 69 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 7 avril 2007 - 3 janv. 2005 à 20:42
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 4 janv. 2005 à 21:15
Bonjour,
J'utilise la fonction suivante : SetSysColors
avec comme paramètre COLOR_BACKGROUND
afin de changer la couleur de fond du bureau et à chaque fois cela semble avoir des impacts sur les fenètres ouvertes : typiquement je suis en édition sur une propriété d'un contrôle (en mode design, sous VS.net et en pleine écran) et hop dès que SetSysColors() se déclenche, mon écran fait un petit clignotement, et je sors du mode édition : c'est particulièrement pénible.
Est-ce que SetSysColors envoie des sorte de message de mise à jour aux fenètres autres que le bureau ? Est-ce que qqn a une idée, parce moi je sèche ...
Merci.
Cordialement.

9 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
3 janv. 2005 à 20:53
Description de SetSysColors

SetSysColors changes the system colors used by Windows. Windows uses these colors when displaying the typical widgets such as title bars, scroll bars, the desktop, menus, etc. This function can set multiple different system colors simultaneously, by passing all the new RGB color values in an array. SetSysColors also notifies all windows of the change, so the color change takes effect immediately. However, the new colors are not saved after Windows shuts down.

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
bob94700 Messages postés 69 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 7 avril 2007 4
3 janv. 2005 à 21:38
Arf . ... Merci pour la réponse (et la rapidité). Bon, je comprends mieux maintenant : MS aurait pu filtrer les messges dans certains cas comme celui de COLOR_BACKGROUND

qui ne concerne pas vraiment les autres fenètres, mais bon, faut faire avec ....
Est-ce que quelqu'un à une idée pour modifier la couleur de fond du bureau sans avoir a utiliser cette fonction (pour que je n'ai pas ce problème) ?
0
APWEB Messages postés 74 Date d'inscription lundi 30 juin 2003 Statut Membre Dernière intervention 18 octobre 2006 2
3 janv. 2005 à 23:12
Essaie de remplacer COLOR_BACKGROUD par COLOR_DESKTOP , aparement
c'est la valeur pour le fond du bureau
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getsyscolor.asp)



AP
0
bob94700 Messages postés 69 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 7 avril 2007 4
3 janv. 2005 à 23:27
J'ai trouvé :
COLOR_BACKGROUND = 1
et
COLOR_DESKTOP= ... 1
Donc je suppose que le résultat sera le même.
Merci quand même.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
APWEB Messages postés 74 Date d'inscription lundi 30 juin 2003 Statut Membre Dernière intervention 18 octobre 2006 2
3 janv. 2005 à 23:32
Regarde a cette adresse il y a un exemple (en C++) "Changer les couleurs System
"mais tu devrais pouvoir l'adapter facilement :

http://chgi.developpez.com/tips4/



AP
0
bob94700 Messages postés 69 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 7 avril 2007 4
4 janv. 2005 à 06:11
oui, mais c'est déjà ce que j'ai fait. Mon code était :

int[] ID_OBJET = {DATA.COLOR_BACKGROUND};

int[] ID_COLOR = {color.R + 256*(color.G + 256*color.B)};

USER32.SetSysColors(ID_OBJET.Length, ID_OBJET, ID_COLOR);

avec DATA.COLOR_BACKGROUND = 1;
C'est justement cette fonction qui pose problème pour la raison indiqué par Bidou (elle informe toutes les fenètres par message).
C'est pourquoi je cherche plutôt un autre moyen ... qui n'utilise pas SetSysColors() car je veux éviter que les autres fenètres soient informer d'un changement qui ne les concerne pas et qui surtout pertube l'utilisateur.
a+
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
4 janv. 2005 à 10:16
Tu as essayer de changer le fond par une image ?(SystemParametersInfo SPI_SETDESKWALLPAPER)
Au pire des cas il faudrais utiliser un hook global pour bloquer le message WM_SYSCOLORCHANGE.

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
bob94700 Messages postés 69 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 7 avril 2007 4
4 janv. 2005 à 20:35
Merci pour les infos.
Pour SystemParametersInfo SPI_SETDESKWALLPAPER, cela permet de changer le fond d'écran : mais ici, je souhaite précisément modifier la couleur de fond sans affecter l'image actuellement affichée.
Pour le hook global, je ne connais pas : J'ai trouvé qqc sur SetWindowsHookEx : S'agit-il de cela (avec le paramètre WH_CALLWNDPROC ?) ? Si c'est ça, comment je fais pour rendre global le hook ?
Merci en tout cas pour l'aide.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
4 janv. 2005 à 21:15
Pour l'instant tu sera forcement obligé de passer par une dll "native" (C/C++...) pour faire un hook global.
Mais, après reflexion je me demande si c'est vraiment une bonne idée, c'est peut être un peu lourd pour cette situation

Enfin, si tu veux tenter le coup, jette un coup d'oeil à ça par exemple : Global System Hooks in .NET

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Rejoignez-nous