|
分類:[C#]
Windows7 Ultimate、VisualStudio2008ProfessionalEdition(C#)という環境で、タイマーを使用して時間がきたらシャットダウンするプログラムをWindowsアプリで作っています。
フォーム上には、現在の時刻を表示するTextBoxとセット時間を表示するTextBox、セット時間を入力するためのInputBoxを表示するためのタイマーセットボタンと時間を待たずにシャットダウンするシャットダウンボタンで構成されています。
Windowsアプリではコンピュータがロックしているときは動作しないので、独自にWindowsサービス(ShutdownTimerServise)を作成しロックされていてもシャットダウンができるようにと考えました。
動作は、
@セット時間を入力
Aセット時間を表示するTextBoxのTextChangeでエラーチェック
B正しい書式だったらWindowsサービスを開始(この時、セット時間をサービスへ渡す)
CWindowsサービス内で現在時刻とセット時間を比較し、等しくなったらOnShutdown()を呼び出す
DOnShutdown()で詳細なシャットダウン情報を与えて、シャットダウンさせる。同時にOnStop()を呼び出す
以上の手順でシャットダウンさせようと思っています。
実際動作させてみると、InputBoxでセット時間を入力し【OK】をクリックすると下記のようなエラーで止まってしまいます。
Windowsサービスを作成するのは今回が初めてでどこが間違っているのかわかりません。
どなたか教えてください。
よろしくお願いします。
【エラーメッセージ】
アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。
[続行]をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。
[終了]をクリックすると、アプリケーションは直ちに終了します。
'.'コンピュータで ShutdownTimerServise サービスを開けません。
【ソースコード】
@ShutdownTimer.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualBasic;
using System.ServiceProcess;
namespace ShutdownTimer
{
public partial class frmShutdownTimer : Form
{
private ServiceController sc = new ServiceController("ShutdownTimerService");
public frmShutdownTimer()
{
InitializeComponent();
}
private void btnShutdown_Click(object sender, EventArgs e)
{
Shutdown();
}
private void timer1_Tick(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
txtThisTime.Text = dt.ToString("HH:mm:ss");
if (txtThisTime.Text == txtTimer.Text)
{
MessageBox.Show("シャットダウン開始");
}
}
private void frmAutoShutdown_Load(object sender, EventArgs e)
{
}
private void btnSetTimer_Click(object sender, EventArgs e)
{
string strInput = "";
string[] strs=new string[1];
strInput = Interaction.InputBox("セット時間を入力してください。\n\n書式:【hhmmss】", "タイマー時間セット", "", -1, -1);
if (strInput != "")
{
if (strInput.Length != 6)
{
MessageBox.Show("書式:【hhmmss】で入力して下さい。", "書式違反");
txtTimer.Text = "";
}
else
{
txtTimer.Text = strInput.Substring(0, 2) + ":" + strInput.Substring(2, 2) + ":" + strInput.Substring(4, 2);
strs[0] = txtTimer.Text;
if (sc.Status == ServiceControllerStatus.Stopped)
{
sc.Start(strs);
}
}
}
}
private void Shutdown()
{
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
psi.FileName = "shutdown.exe";
//コマンドラインを指定
psi.Arguments = "/r /t 20";
//ウィンドウを表示しないようにする
psi.CreateNoWindow = true;
//起動
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
}
}
}
AShutdownTimerService.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
namespace ShutdownTimerService
{
public partial class ShutdownTimerService : ServiceBase
{
private string[] _strs = new string[1];
public ShutdownTimerService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
_strs[0] = args[0];
EventLog.WriteEntry("ShutdownTimerServiceを開始しました。", "Infomation");
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
}
protected override void OnStop()
{
EventLog.WriteEntry("ShutdownTimerServiceを終了しました。", "Infomation");
}
protected override void OnShutdown()
{
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
psi.FileName = "shutdown.exe";
//コマンドラインを指定
psi.Arguments = "/r /t 20";
//ウィンドウを表示しないようにする(こうしても表示される)
psi.CreateNoWindow = true;
//起動
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
base.OnStop();
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
DateTime dtTimer = Convert.ToDateTime(_strs[0]);
string strTimer = dtTimer.ToLongDateString();
DateTime dtThisTime = DateTime.Now;
string strThisTime = dtThisTime.ToLongDateString();
if (strTimer == strThisTime)
{
base.OnShutdown();
}
}
}
}
BProjectInstaller.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Windows.Forms;
namespace ShutdownTimerService
{
[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
public ProjectInstaller()
{
InitializeComponent();
}
private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
MessageBox.Show("サービスが正常にインストールされました。");
}
}
}
CserviceInstallerのプロパティ
Discription:設定時間によってシャットダウンを実行します。
DisplayName:ShutdownTimerService
Parent:ProjectInstaller
ServiceName:ShutdownTimerService
StartType:Automatic
(Name):serviceInstaller
その他の項目はデフォルト
DserviceProcessInstallerのプロパティ
Account:LocalService
Parent:ProjectInstaller
(Name):serviceProcessInstaller
その他の項目はデフォルト
EProjectInstallerのプロパティ
(Name):ProjectInstaller
その他の項目はデフォルト
FShutdownTimerServiceのプロパティ
CanPauseAndContinue:True
CanShutdown:True
ServiceName:ShutdownTimerService
(Name):ShutdownTimerService
その他の項目はデフォルト
Gtimerのプロパティ
(Name):timer
Interval:1000
その他の項目はデフォルト
HeventLogのプロパティ
(Name):eventLog
その他の項目はデフォルト
|