CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Changer fond d'écran

JujuDredd
JujuDredd
Niveau 10
29 mars 2008 à 11:50:35

Je voudrais faire un programme pour changer périodiquement mon fond d'écran. Bon, j'ai trouvé quoi changer dans la base des registres (pas trop dur d'y rechercher le nom de l'image qui y est pour le moment), il faut modifier dans [HKEY_CURRENT_USER\Control Panel\Desktop] les clés TileWallpaper, WallpaperStyle, et surtout Wallpaper. Seulement, bien sûr, Windows n'en tient compte qu'au démarrage de la session. Y a-t-il un moyen, par une API Win32, de lui faire recharger ?

dnob700
dnob700
Niveau 10
29 mars 2008 à 20:10:54

Cet article décrit comment faire en C#. Mais les appels systèmes sont les même qu'en C donc ça devrait répondre à ta question.

http://blogs.msdn.com/coding4fun/archive/2006/10/31/912569.aspx

JujuDredd
JujuDredd
Niveau 10
30 mars 2008 à 19:02:34

C'est marant ça : j'ai fait une recherche sur le web et j'ai trouvé que la fonction en question ne marche qu'avec des bitmap (pour Windows XP ou inférieur). Je me suis demandé comment faisait Windows, dans ce cas, pour nous permettre de mettre un jpeg ou autre. Eh bien je me suis rendu compte qu'en fait, si on met un jpeg, Windows le convertit puis mets dans le registre le fichier suivant :
<Disque système>:\Documents and Settings\<login>\Local Settings\Application Data\Microsoft\Wallpaper1.bmp

Et ça me fait marrer car j'ai toujours converti tous mes fichiers en bitmap avant de les mettre en fond d'écran, en me disant que Windows sera plus rapide à les afficher... et en fait ça sert à rien puisque c'est ce qu'il fait lui-même...

JujuDredd
JujuDredd
Niveau 10
06 avril 2008 à 09:45:34

Argh, j'arrive pas à trouver sur le web, je cherche l'équivalent d'une fonction sous UNIX qui envoie un message au bout de x secondes (ou millisecondes). Quelle API pourrait faire ça ?

Sinon, vous connaissez le moyen utilisé pour éviter qu'une application soit lancée deux fois par le même utilisateur ?

UltraSPARC
UltraSPARC
Niveau 2
06 avril 2008 à 11:13:31

Sinon, vous connaissez le moyen utilisé pour éviter qu'une application soit lancée deux fois par le même utilisateur ?

:d) Quand ton programme se lance, il vérifie dans un fichier spécifique si il y a un pid, si il y en a un et qu'il est valide (le processus est en train de tourner quoi), ton programme s'arrête; sinon il écrit son pid dans le fichier.

UltraSPARC
UltraSPARC
Niveau 2
06 avril 2008 à 11:23:06

En fait en me demandant comment on récupérait un pid sous windows, je suis tombé la dessus :
http://www.cppfrance.com/infomsg_RECUPERATION-PID-PROCECUSS_740118.aspx
Tu peux directement parcourir la liste des processus, et chercher dans la liste si y en as pas un deuxième qui à le même nom que toi.

godrik
godrik
Niveau 30
06 avril 2008 à 11:44:30

jujudredd, fait un topic par question, ca aide a reconnaitre ce qui se dit...

"Argh, j'arrive pas à trouver sur le web, je cherche l'équivalent d'une fonction sous UNIX qui envoie un message au bout de x secondes (ou millisecondes). Quelle API pourrait faire ça ?"
utiliser les signaux ? (sigalarm)

"Sinon, vous connaissez le moyen utilisé pour éviter qu'une application soit lancée deux fois par le même utilisateur ?"
il y a plein d'application qui font des choses comme cela.
Souvent, les programmes utilisent l'atomicité des créations de fichiers pour faire cela. (les fichiers de lock). L'idée est d'utiliser une ressource que tu ne peux ouvrir qu'une seule fois, un port TCP, une création de fichier de pipe nommé.

Globalement c'est assez naze si le programme fait des sorties graphique.
j'ai tout le temps le probleme avec firefox. il ne s'ouvre qu'une seule fois et on ne peux pas lui faire ouvrir de fenetre sur plusieurs display different.
C'est assez fatiguant quand tu utilises deux ecrans SANS xinerama...

UltraSPARC, verifier si un processus n'a pas le meme nom que toi n'est pas suffisant.
dos2unix et unix2dos ont deux noms different mais son bel et bien le meme binaire (un lien dur est utilisé)

JujuDredd
JujuDredd
Niveau 10
06 avril 2008 à 11:58:30

"jujudredd, fait un topic par question, ca aide a reconnaitre ce qui se dit..." :d) Ok, mais j'avais pas envie de créer une multitudes de mini-topics.

"utiliser les signaux ? (sigalarm)" :d) Justement, je chercher son équivalent en API Windows. Sinon j'ai fini par trouver SetTimer et KillTimer, et ces fonctions me conviennent.

"Globalement c'est assez naze si le programme fait des sorties graphique.
j'ai tout le temps le probleme avec firefox. il ne s'ouvre qu'une seule fois et on ne peux pas lui faire ouvrir de fenetre sur plusieurs display different." :d) Ok, j'y avais pas pensé, je peux laisser tomber ça alors, de toute façon c'est pas très gênant si le programme se lance deux fois, c'est juste inutile si le display est deux fois le même.

godrik
godrik
Niveau 30
06 avril 2008 à 12:13:57

"Justement, je chercher son équivalent en API Windows. Sinon j'ai fini par trouver SetTimer et KillTimer, et ces fonctions me conviennent."
Ca fait des années que je n'ai pas ecrit de code pour windows, mais de mémoire, settimer et killtimer gerent le message timer qui est envoyer a une fenetre. Ca veut dire que si aucune fenetre n'est crée, tu ne recois pas ces messages. De plus, je ne penses pas que le temps soit précis. Cependant, tu n'as pas peut etre pas besoin de precision...

JujuDredd
JujuDredd
Niveau 10
06 avril 2008 à 13:03:30

Non, non, c'est pour changer le fond d'écran toutes les x minutes, aucun besoin d'être ultra-précis.
Sinon c'est vrai que c'est pas pratique que les messages soient ratachés à une fenêtre, alors que justement je voudrais pouvoir le faire tourner avec juste une icône dans la Tray.

godrik
godrik
Niveau 30
06 avril 2008 à 13:32:21

tu peux aussi mettre un thread qui s'endort avec sleep... (ou Sleep peut etre sous windows)

JujuDredd
JujuDredd
Niveau 10
06 avril 2008 à 15:10:43

Attends c'est bon avec SetTimer et KillTimer !
En fait je peux cacher la fenêtre de dialogue sans la détruire et les WM_TIMER sont bien envoyés.

dnob700
dnob700
Niveau 10
06 avril 2008 à 15:45:44

Pour éviter de lancer plusieurs fois la même appli, la méthode canonique sous windows c'est d'utiliser un mutex nommé, plutôt que des fichiers.

Pour les messages, il y a un type de fenêtre spécialement prévu pour récuperer des messages mais sans s'afficher. De toutes manières, pour gérer une tray icon, tu as besoin d'une fenêtre qui va récupérer ses messages.

JujuDredd
JujuDredd
Niveau 10
06 avril 2008 à 17:20:19

"Pour éviter de lancer plusieurs fois la même appli, la méthode canonique sous windows c'est d'utiliser un mutex nommé, plutôt que des fichiers." :d) Ok, maintenant que je sais quoi chercher sur le web je devrais trouver...

"Pour les messages, il y a un type de fenêtre spécialement prévu pour récupérer des messages mais sans s'afficher." :d) Ah, c'est bon à savoir ça. Mais dans le cas présent j'ai de toutes façons besoin d'une fenêtre pour choisir les fond d'écran ou régler le temps entre chaque changement, donc autant se contenter de masquer cette fenêtre.

Quand j'aurais fini je mettrai mon code sur mon site web et je posterai un lien, au cas où ça intéresse des gens.

JujuDredd
JujuDredd
Niveau 10
06 avril 2008 à 17:23:31

Ah oui, j'oublie toujours un truc quand je passe sur ce forum...

:merci: de votre aide.

JujuDredd
JujuDredd
Niveau 10
19 février 2010 à 23:28:32

Bonjour, je remonte ce topic car je me suis remis récemment à la programmation de mon changeur de fond d'écran...

En fait je me suis rendu compte que si je le laisse tourner alors qu'un jeu vidéo est en mode plein écran ça peut me pourrir l'affichage du jeu. Évidemment j'en ai rien à faire de changer le fond d'écran pendant que je joue, le mieux serait de pouvoir détecter qu'un programme est en mode plein écran, mais j'ignore si c'est possible simplement. Quelqu'un aurait une idée ?

furticator
furticator
Niveau 7
21 février 2010 à 17:02:58

En C# ça doit pouvoir se réaliser simplement mais j'ai aucune idée de l'algorithme (je suis débutant en programmation).

dnob700
dnob700
Niveau 10
21 février 2010 à 20:33:34

...

Ça ne dépend pas bien sûr du langage, mais uniquement de l'api du système. Ce genre de chose peut certainement ce faire, mais jamais très simplement, il s'agit toujours d'astuce compliqué.

Cela dit c'est le genre de problème que google peut aider à résoudre facilement. Une recherche du type "win32 detect fullscreen" semble donner d'assez bons résultats.

JujuDredd
JujuDredd
Niveau 10
23 février 2010 à 20:15:15

Merci dnob700 !

Et honte à moi de ne même pas avoir pensé à chercher avec Google !

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment