Gå til innhold

Anbefalte innlegg

Noen som har erfaring med å programmere en skjermsparer?

Finnes det noe rammeverk fra MS som man kan ta utgangspunktet i eller må man starte helt på scratch?

 

Tanken er å lage en skjermsparer som henter RSS feeds og viser disse, samt 2-4 bilder fra en fast nettside.

Lenke til kommentar
Videoannonse
Annonse

En screensaver er en helt vanlig applikasjon med scr som filendelse. Det eneste spesielle er at Windows sender noen parametre som du må sjekke. De er henholdsvis /c /p og /s.

 

/c : vis dialog for konfigurasjon av screensaver

/p : forhåndsvisning av screensaver

/s : aktivér screensaver

 

Under finner du koden til en enkel screensaver. Rename fila til *.scr og legg den i WINDOWS-katalogen. Jeg har hardkodet mye for å holde koden så enkel som mulig.

 

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using System.Text;
using System.IO;

namespace MyScreensaver
{
   
   static class Program
   {
       [STAThread]
       static void Main(string[] args)
       {

           if (args.Length > 0)
           {
               string arg = args[0].ToLower().Trim().Substring(0, 2);

               switch (arg)
               {
                   case "/c":
                       // vis dialog for innstillinger
                       ShowOptions();
                       break;

                   case "/p":
                       // forhåndsvisning av screensaver
                       break;

                   case "/s":
                       // kjør screensaver!
                       RunScreenSaver();
                       break;

                   default:
                       // ukjent argument...
                       MessageBox.Show("Invalid command line argument");
                       break;
               }
           }
           else
           {
               // vis en feilmelding her..
           }
       }


       static void ShowOptions()
       {
           // denne får du nesten implementere selv... :)
           MessageBox.Show("Show options dialog");
       }

       
       static void RunScreenSaver()
       {
           ScreenSaverForm form = new ScreenSaverForm();
           form.ImageFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
           Application.Run(form);
       }
   
   }
   
   
   
   public class ScreenSaverForm : Form
   {
       string _imageFolder;
       private List<string> _imagePaths = new List<string>();
       private Image _currentImage;
       private int _currentImageIndex = 0;
       private Timer _timer = new Timer();
       
       // noen variabler for å hindre at applikasjonen stopper i oppstarten (se OnMouseMove)
       private Point _mousePosition;
       private bool _started = false;
       


       public string ImageFolder
       {
           get { return _imageFolder; }
           set { _imageFolder = value; FindImagesFromFolder(value); LoadNextImage(); }
       }


       public ScreenSaverForm()
       {
           // fullskjerm
           TopMost = true; 
           Cursor.Hide();
           FormBorderStyle = FormBorderStyle.None;
           Bounds = Screen.PrimaryScreen.Bounds;
           WindowState = FormWindowState.Maximized;
           ShowInTaskbar = false;

           // last første bilde
           LoadNextImage();

           // starter timeren
           _timer.Interval = 5000;
           _timer.Enabled = true;
           _timer.Tick += new EventHandler(OnTimer);
       }

       /// <summary>
       /// Finner alle jpeg-bilder i den spesifisert filbanen og legger filbanen i listen.
       /// </summary>
       /// <param name="folder">Katalog som skal gjennomsøkes.</param>
       private void FindImagesFromFolder(string folder)
       {
           _imagePaths.Clear();

           DirectoryInfo folderInfo = new DirectoryInfo(folder);

           foreach (FileInfo file in folderInfo.GetFiles("*.jpg"))
           {
               _imagePaths.Add(file.FullName);
           }

           _currentImageIndex = -1;
       }


       /// <summary>
       /// Laster inn neste bilde
       /// </summary>
       private void LoadNextImage()
       {
           if (_imagePaths.Count <= 0)
           {
               _currentImage = null;
               _currentImageIndex = -1;
               return;
           }

           if (++_currentImageIndex >= _imagePaths.Count)
               _currentImageIndex = 0;

           try
           {
               _currentImage = Image.FromFile(_imagePaths[_currentImageIndex]);
           }
           catch (Exception)
           {
               _imagePaths.RemoveAt(_currentImageIndex--);
               LoadNextImage();
           }

           Invalidate();
       }

       /// <summary>
       /// Tegner bildet i bakgrunnen
       /// </summary>
       /// <param name="e"></param>
       protected override void OnPaintBackground(PaintEventArgs e)
       {
           if (_currentImage == null)
           {
               e.Graphics.FillRectangle(Brushes.Black, Bounds);
               return;
           }

           // vi bare strekker bildet for å gjøre det enkelt
           e.Graphics.DrawImage(_currentImage, Bounds);
       }

       /// <summary>
       /// Laster neste bilde når timeren trigger.
       /// </summary>
       void OnTimer(object sender, EventArgs e)
       {
           LoadNextImage();
       }

       protected override void OnMouseMove(MouseEventArgs e)
       {
           // her må gjøre en liten sjekk for å forhindre at
           // applikasjonen avsluttes i oppstarten.

           if (!_started)
           {
               _started = true;
               _mousePosition = MousePosition;
           }
           else
           {
               if ((Math.Abs(MousePosition.X - _mousePosition.X) > 10) ||
                   (Math.Abs(MousePosition.Y - _mousePosition.Y) > 10))
               {
                   Close();
               }
           }
       }

       protected override void OnMouseDown(MouseEventArgs e)
       {
           Close();
       }

       protected override void OnKeyDown(KeyEventArgs e)
       {
           Close();
       }
   }
}

Endret av kjetil7
Lenke til kommentar

Hei, takk for raskt svar. Siden det er som en vanlig exe fil så antar jeg det ikke er noe spesialting i forhold til skjermsparer enn som for et vanlig program.

Greit å vite, når det gjelder selve kodingen så er jeg bare en n00b selv, men har takk og pris en profesjonell programmerer som skal lage dette på oppdrag.

 

Men ville få litt bakgrunnsinfo før jeg lager bestillingen.

Kan forsåvidt publisere skjermspareren når den er ferdig, men den blir nok veldig skreddersydd for å vise ting fra vårt intranett og bilder vi har rettigheter til.

Vi får se hvordan det utarter seg.

:cool:

En screensaver er en helt vanlig applikasjon med scr som filendelse. Det eneste spesielle er at Windows sender noen parametre som du må sjekke. De er henholdsvis /c  /p  og /s.

 

/c  : vis dialog for konfigurasjon av screensaver

/p  : forhåndsvisning av screensaver

/s  : aktivér screensaver

 

Under finner du koden til en enkel screensaver. Rename fila til *.scr og legg den i WINDOWS-katalogen. Jeg har hardkodet mye for å holde koden så enkel som mulig.

 

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using System.Text;
using System.IO;

namespace MyScreensaver
{
   
   static class Program
   {
       [STAThread]
       static void Main(string[] args)
       {

           if (args.Length > 0)
           {
               string arg = args[0].ToLower().Trim().Substring(0, 2);

               switch (arg)
               {
                   case "/c":
                       // vis dialog for innstillinger
                       ShowOptions();
                       break;

                   case "/p":
                       // forhåndsvisning av screensaver
                       break;

                   case "/s":
                       // kjør screensaver!
                       RunScreenSaver();
                       break;

                   default:
                       // ukjent argument...
                       MessageBox.Show("Invalid command line argument");
                       break;
               }
           }
           else
           {
               // vis en feilmelding her..
           }
       }


       static void ShowOptions()
       {
           // denne får du nesten implementere selv... :)
           MessageBox.Show("Show options dialog");
       }

       
       static void RunScreenSaver()
       {
           ScreenSaverForm form = new ScreenSaverForm();
           form.ImageFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
           Application.Run(form);
       }
   
   }
   
   
   
   public class ScreenSaverForm : Form
   {
       string _imageFolder;
       private List<string> _imagePaths = new List<string>();
       private Image _currentImage;
       private int _currentImageIndex = 0;
       private Timer _timer = new Timer();
       
       // noen variabler for å hindre at applikasjonen stopper i oppstarten (se OnMouseMove)
       private Point _mousePosition;
       private bool _started = false;
       


       public string ImageFolder
       {
           get { return _imageFolder; }
           set { _imageFolder = value; FindImagesFromFolder(value); LoadNextImage(); }
       }


       public ScreenSaverForm()
       {
           // fullskjerm
           TopMost = true; 
           Cursor.Hide();
           FormBorderStyle = FormBorderStyle.None;
           Bounds = Screen.PrimaryScreen.Bounds;
           WindowState = FormWindowState.Maximized;
           ShowInTaskbar = false;

           // last første bilde
           LoadNextImage();

           // starter timeren
           _timer.Interval = 5000;
           _timer.Enabled = true;
           _timer.Tick += new EventHandler(OnTimer);
       }

       /// <summary>
       /// Finner alle jpeg-bilder i den spesifisert filbanen og legger filbanen i listen.
       /// </summary>
       /// <param name="folder">Katalog som skal gjennomsøkes.</param>
       private void FindImagesFromFolder(string folder)
       {
           _imagePaths.Clear();

           DirectoryInfo folderInfo = new DirectoryInfo(folder);

           foreach (FileInfo file in folderInfo.GetFiles("*.jpg"))
           {
               _imagePaths.Add(file.FullName);
           }

           _currentImageIndex = -1;
       }


       /// <summary>
       /// Laster inn neste bilde
       /// </summary>
       private void LoadNextImage()
       {
           if (_imagePaths.Count <= 0)
           {
               _currentImage = null;
               _currentImageIndex = -1;
               return;
           }

           if (++_currentImageIndex >= _imagePaths.Count)
               _currentImageIndex = 0;

           try
           {
               _currentImage = Image.FromFile(_imagePaths[_currentImageIndex]);
           }
           catch (Exception)
           {
               _imagePaths.RemoveAt(_currentImageIndex--);
               LoadNextImage();
           }

           Invalidate();
       }

       /// <summary>
       /// Tegner bildet i bakgrunnen
       /// </summary>
       /// <param name="e"></param>
       protected override void OnPaintBackground(PaintEventArgs e)
       {
           if (_currentImage == null)
           {
               e.Graphics.FillRectangle(Brushes.Black, Bounds);
               return;
           }

           // vi bare strekker bildet for å gjøre det enkelt
           e.Graphics.DrawImage(_currentImage, Bounds);
       }

       /// <summary>
       /// Laster neste bilde når timeren trigger.
       /// </summary>
       void OnTimer(object sender, EventArgs e)
       {
           LoadNextImage();
       }

       protected override void OnMouseMove(MouseEventArgs e)
       {
           // her må gjøre en liten sjekk for å forhindre at
           // applikasjonen avsluttes i oppstarten.

           if (!_started)
           {
               _started = true;
               _mousePosition = MousePosition;
           }
           else
           {
               if ((Math.Abs(MousePosition.X - _mousePosition.X) > 10) ||
                   (Math.Abs(MousePosition.Y - _mousePosition.Y) > 10))
               {
                   Close();
               }
           }
       }

       protected override void OnMouseDown(MouseEventArgs e)
       {
           Close();
       }

       protected override void OnKeyDown(KeyEventArgs e)
       {
           Close();
       }
   }
}

5915325[/snapback]

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...