2013/01/13

[C#]アプリケーションが UserInteractive モードで実行されていないときに、モーダル ダイアログまたはフォームを表示することは有効な操作ではありません。

,
 えっと、タスクスケジューラで自分で書いたWindowsフォームアプリケーションを起動しようとして、なんか詰まった点2つの話です。

1)タスクスケジューラがエラーを返す

 毎日0800に.exeを起動するようにタスクスケジューラに登録して、次の日確認してみたら案の定動いてませんでした。翌日、その次の日も結局動かずで。タスクスケジューラの管理画面を見ると、どうやら2147750692というエラーで止まっているようです(下の写真参照)。
こんなエラーが出ました

 ネットで調べてみると、2147750692というエラーコードは

The Task Scheduler service attempted to run the task, but the task did not run due to one of the constraints in the task definition. 

とのこと。はあ、つまり何らかの理由で動かんかったよ、と。原因が絞れないですね…
 とりあえず、「タスクスケジューラ」手動でタスクをスケジュールする方法<Windows Vista(R)>: dynabook.comサポート情報を参考にして、タスクの設定を変えてみます。結局動かずじまいでした。


2)テストしたら'System.InvalidOperationException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました。って出た

 で、タスクスケジューラは試しにその場でタスクを実行できるので、やってみたところ「デバッガを起動しますか?」とダイアログが出たので、VS2008を起動してみたら上記の例外が発生していたみたいです。
こんな感じで、タスク上を右クリックで[実行する]メニューが出てくる~~~~
 
上記の例外の全文は
'System.InvalidOperationException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました。

アプリケーションが UserInteractive モードで実行されていないときに、モーダル ダイアログまたはフォームを表示することは有効な操作ではありません。サービス アプリケーションからの通知を表示するには、ServiceNotification または DefaultDesktopOnly スタイルを指定してください

です。要はタスクスケジューラから起動するときはフォームとかMessageBox使わないでねってことなんですかね…"UserInteractiveモード(ユーザ対話モード)"の定義がなかなか見つかりませんでして…

 で、そうなるとプログラムを修正しないといけなくて、実はUserInteractiveモードか否かは
boolean IsUserInteractive = Environment.UserInteractive;
というコードで取得できるみたいなので、
[STAThread]
static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    if (Environment.UserInteractive)
    {
        //UserInteractiveモードなので表示
        Application.Run(new Form1());
    }
    else
    {
        //UserInteractiveモードじゃないときは、ここでUIを使わないコードをごにょごにょ
    }
}

というコード書いて、Main()でFormを表示する前に分岐させてみました。というお話。動いてくれるといいな…(動作確認してない)

0 コメント to “[C#]アプリケーションが UserInteractive モードで実行されていないときに、モーダル ダイアログまたはフォームを表示することは有効な操作ではありません。”

コメントを投稿