Gadmin Skrevet 13. april 2006 Del Skrevet 13. april 2006 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
Peter Skrevet 13. april 2006 Del Skrevet 13. april 2006 Kan dessverre ikke hjelpe med noe konkstruktivt, annet at det var et interessant program som jeg gjerne vil titte på når det er ferdig. Lenke til kommentar
kjetil7 Skrevet 13. april 2006 Del Skrevet 13. april 2006 (endret) 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 13. april 2006 av kjetil7 Lenke til kommentar
Gadmin Skrevet 13. april 2006 Forfatter Del Skrevet 13. april 2006 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. 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
Peter Skrevet 13. april 2006 Del Skrevet 13. april 2006 Dersom dere slipper den som opensource så skal jeg nok klare å endre den til å passe mine behov. Lenke til kommentar
Gadmin Skrevet 13. april 2006 Forfatter Del Skrevet 13. april 2006 ja vi får se da vet du... Dersom dere slipper den som opensource så skal jeg nok klare å endre den til å passe mine behov. 5915897[/snapback] Lenke til kommentar
j000rn Skrevet 14. april 2006 Del Skrevet 14. april 2006 I VS.Net 2005 så er det et egent prosjekttype for screensaver. Det ligger under "Starter kit" når man velger nytt prosjekt. Lenke til kommentar
Gråskjegg Skrevet 14. april 2006 Del Skrevet 14. april 2006 (endret) Google redder dagen: MS eksempel Edit: Hit #2; det er visst del av standard Visual Studio ExpressVisual Studio Express. - grå - Endret 14. april 2006 av Gråskjegg Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå