我在一个没有GUI的app(仅通知图标)中有一个Timer来监视某些条件(比如Process正在运行),当满足这些条件时,我必须创建一个钩子(SetWinEventHook)。问题是必须在主线程上创建钩子,否则我的回调不会返回。
怎么做?我已经尝试了所有的东西,唯一的方法是使用System.Windows.Forms.Timer,但我不希望我的监视计时器在与我的应用程序相同的线程中运行,所以我想使用Timers。计时器或线程。计时器。
答案 0 :(得分:1)
如果你有一个没有GUI的应用程序,你应该使用System.Threading.Timer
Comparing the Timer Classes in the .NET Framework Class Library
如果您希望timer事件访问UI控件,则需要使用Invoke()对UI线程进行编组。
答案 1 :(得分:0)
当app启动时,创建一个静态变量来存储对windows表单对象的引用。 如果您实际从main启动线程,您还可以将表单对象引用作为参数传递给线程。
编辑:实际上,如果您需要线程在创建对象后访问该对象,则只需要静态。否则,您几乎可以在几乎所有情况下都将表单引用作为参数传递。
即
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.
}
}