前回、特定のアプリケーションが起動しているときはスクリーンセーバーを抑止するプログラムを作成しましたが、設定を保存できるようにはなっていませんでした。そこで設定を保存できるようにします。また普段はタスクトレイのなかに表示されるように改良します。
まずは×ボタンをクリックしても終了せずにタスクトレイに入る処理をおこないます。本当に終了させたいときはメニューの終了をクリックします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public partial class Form1 : Form { public Form1() { notifyIcon1.Text = Application.ProductName; // その他の処理は前回と同じなので省略 // } private void notifyIcon1_MouseDown(object sender, MouseEventArgs e) { if(this.Visible) this.Visible = false; else this.Visible = true; } private void notifyIcon1_MouseDown(object sender, MouseEventArgs e) { if(this.Visible) this.Visible = false; else this.Visible = true; } bool isEnd = false; protected override void OnFormClosing(FormClosingEventArgs e) { if(!isEnd) { e.Cancel = true; this.Visible = false; } base.OnFormClosing(e); } private void EndMenuItem_Click(object sender, EventArgs e) { if(DialogResult.Yes == MessageBox.Show("終了しますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) { isEnd = true; Application.Exit(); } } } |
次に設定の保存ですが、起動するたびに自分でファイルを読み込むのは面倒なので、起動したら自動で設定ファイルを読み込むようにしましょう。
まず設定の保存から。終了する直前にProcessNamesの内容を保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
// 追加 using System.IO; using System.Xml.Serialization; public class Config { public List<string> ProcessNames = null; } public partial class Form1 : Form { protected override void OnFormClosing(FormClosingEventArgs e) { if(!isEnd) { e.Cancel = true; this.Visible = false; } // 終了する直前に設定を保存する SaveConfig(); base.OnFormClosing(e); } string ConfigFilePath { get { return Application.UserAppDataPath + "\\StopScreenSaverConfig.xml"; } } void SaveConfig() { XmlSerializer xml = new XmlSerializer(typeof(Config)); StreamWriter sw = new StreamWriter(ConfigFilePath); Config Config = new Config(); Config.ProcessNames = ProcessNames.OrderBy(x => x).ToList(); xml.Serialize(sw, Config); sw.Close(); } } |
起動したとき設定ファイルが存在するのであれば読み込み、ないなら何もしないで初期状態で起動します。起動直後にスクリーンセーバーの起動は抑止されているのかが分かるような処理をしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public partial class Form1 : Form { void LoadConfig() { if(!File.Exists(ConfigFilePath)) return; XmlSerializer xml = new XmlSerializer(typeof(Config)); StreamReader sr = new StreamReader(ConfigFilePath); Config Config = (Config)xml.Deserialize(sr); sr.Close(); ProcessNames = Config.ProcessNames; foreach(string str in ProcessNames) { listBox1.Items.Add(str); } } protected override void OnLoad(EventArgs e) { // 設定を読み込む LoadConfig(); // 必要ならスクリーンセーバーの起動を抑止する if(GetProcessNames().Intersect(ProcessNames).Any()) { PreventScreenSaverFromStarting(); ShowState(true); } else ShowState(false); base.OnLoad(e); } } |