2009-08-05 9 views
1

特定の条件(プロセスが実行中の場合など)を監視し、それらの条件が満たされたときにGUIレスのアプリケーション(通知アイコンのみ)フック(SetWinEventHook)。問題は、メインスレッドでフックを作成する必要があります。それ以外の場合、コールバックは返されません。.NETのTimers.Timerからメインスレッドにアクセスする

どうすればよいですか?私はすべてを試してきましたが、これがうまくいった唯一の方法は、System.Windows.Forms.Timerを使用していましたが、自分のアプリケーションと同じスレッドで監視タイマを実行したくないので、Timersを使用します。タイマーまたはThreading.Timer。

答えて

1

あなたはGUIレスのアプリケーションを持っている場合は、タイマーイベントを使用すると、UIスレッドにマーシャリングする必要があり、その後UIコントロールにアクセスしたい場合は、System.Threading.Timer

Comparing the Timer Classes in the .NET Framework Class Library

を使用する必要がありますInvoke()を使用します。

+0

私はすでにこの比較研究を行っていますが、私はそれに関する私のテストに基づいています。 私のアプリにはUIコントロールがありません。メインスレッドでメソッドを実行するだけで、フックが作成されます。 Luiz Borges –

0

アプリが起動すると、静的変数を作成してWindowsフォームオブジェクトへの参照を保存します。 実際にメインからスレッドを開始する場合は、スレッドとしてフォームオブジェクト参照をパラメータとして渡すこともできます。

EDIT:実際には、スレッドを作成した後にオブジェクトにアクセスする必要がある場合にのみ、静的な操作が必要です。それ以外の場合は、ほぼすべての場合にフォーム参照をパラメータとして渡すことができます。

すなわち

internal static System.Windows.Form mainForm; 

public static void Main(string[] args) 
{ 
    mainForm = new NotifyIconApplication(); 

    //start thread here. 

    Application.Run(mainForm); 
} 

あなたのスレッドは、今、あなたのMainFormへの参照にアクセスすることができます。

これで、そのオブジェクトのメソッドを呼び出すことができましたが、ここからフォームを実行するにはフォームスレッドでメソッドを呼び出す必要があります。

internal void MyMethod(object params) 
{ 
    if(this.InvokeRequired) 
    { 
     //This causes your hook creation to run on the forms thread 
     this.Invoke(DelegateToMyMethod, params); 
    } 
    else 
    { 
     //Create hook. 
    } 
} 
関連する問題