タイトル : Re^2: 他アプリを起動するサービスを作れますか? 投稿日 : 2008/04/22(Tue) 09:23 投稿者 : ヤマザキ
> > サービスにて FindWindow, Process.Start を使用することができないのでしょうか? > > 聞く前に、まずは Process.Start だけ使用できるかどうか確認テストをされてみたら > 問題の切り分けができそうですが・・・ y4yama 様 アドバイスありがとうございます。 では、長文になりますが、私がテストした内容について書かせていただきます。 そうすれば、サービスにて FindWindow の使用可否, Process.Start の使用可否が 問題なのか、コーディングの問題なのかの切り分けもできますね。 サービスを作成するのが初めてなのでコーディングに問題ありの可能性大ですし。 [開発マシン] WinXP Pro SP2 VS2005 Pro(日本語 SP1 適用) [サービスインストール先端末=開発マシン] .NET Framework 2.0 SP1 .NET Framework 2.0 SP1 Language Pack - JPN .NET Framework 3.0 SP1 .NET Framework 3.0 SP1 Language Pack - JPN (他、1.1, Compact Framework 2.0 等) [不具合内容] 1. 監視しているアプリケーションが動作していなくても、 FindWindow の返り値が 0 にならない。 2. Start しようとしているアプリケーションが起動しない。 [ソース(抜粋)] Public Class myService <System.Runtime.InteropServices.DllImport("user32.dll", _ CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _ Private Shared Function FindWindow( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As IntPtr End Function Private LoopTmr As System.Timers.Timer = Nothing ' 監視用タイマー ' サービス開始 Protected Overrides Sub OnStart(ByVal args() As String) ' サーバベースタイマインスタンス作成 LoopTmr = New System.Timers.Timer With LoopTmr .Interval = 5000 .Enabled = True End With ' イベントハンドラの関連付け AddHandler LoopTmr.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf Me.myTimer_Elapsed) End Sub ' タイマー処理 Private Sub myTimer_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) ' 動作確認 Dim hwnd As IntPtr hwnd = FindWindow(vbNullString, "無題 - メモ帳") Call WriteToLog(hwnd) ' 起動 ' If (hwnd = 0) Then ' 本来ならコメントアウトしないが、試験のため System.Diagnostics.Process.Start("C:\WINDOWS\system32\notepad.exe") ' End If End Sub End Class [特記] ・上記ソース中、OnStop, WriteToLog メソッドは略しましたが実際には存在します。 WriteToLog メソッドは稼動時刻(Now)と hwnd 値をテキストファイルに出力します。 ・サービスの作成に際し、下記チュートリアルを参考にしました。 「http://msdn2.microsoft.com/ja-jp/library/zt39148a.aspx」 サービス名や処理内容は変更し、サービスの StartType=Manual としましたが、 それ以外はチュートリアルに従ったつもりです。 ・サービスインストール後、コンピュータの管理画面のサービス一覧にて インストールしたサービスが存在します。開始・停止でも、稼働中も Windows イベントログにエラーはあがりません。 ・稼働中 myTimer_Elapsed 中の WriteToLog にて、ログファイルには タイマーが稼動した時刻、hwnd が随時追加出力されていきます。 ただし "無題 - メモ帳" が稼動していない時でも、hwnd の値は 0以外の値になります(例:CStr(hwnd) = 10224714)。 ・サービスを実行しているプロセスにデバッガをアタッチすることによる サービスのデバッグ方法は、現時点では実施していません。 ・Windows アプリケーションを作成し、myTimer_Elapsed 中の処理を ボタンクリックイベント中で実行させると、"無題 - メモ帳" が 稼動していなければ hwnd=0 になり、強制起動も成功しました。 説明が不足している点についてはご質問下さい。 また「これを試してみた方がいい」のアドバイスも歓迎しますのでよろしくお願いします。 |