tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 になり、強制起動も成功しました。

説明が不足している点についてはご質問下さい。
また「これを試してみた方がいい」のアドバイスも歓迎しますのでよろしくお願いします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。