非终止/非阻止Windows Mobile App

时间:2009-08-07 19:37:27

标签: c# compact-framework hook

我有一个控制台应用程序,我想在后台持续运行。我想如果我启动它然后告诉它等待事情会起作用。但是当我等待时,它会冻结应用程序。

这是我的代码:

课程计划     {         static public ManualResetEvent StopMain;

    static void Main(string[] args)
    {
        // Hide the cursor.
        Cursor.Current = Cursors.Default;

        StopMain = new ManualResetEvent(false);

        RunHook runHook = new RunHook();

        // wait until signalled by Program.StopMain.Set();
        StopMain.WaitOne();             

    }
}

class RunHook
{
    private HookKeys hook;
    public RunHook()
    {
        hook = new HookKeys();
        hook.HookEvent += EventForHook;
    }

    private void EventForHook(HookEventArgs e, KeyBoardInfo keyBoardInfo, 
      ref Boolean handled)
    {
        if ((keyBoardInfo.scanCode == 4) && (keyBoardInfo.vkCode == 114))
            handled = true;
    }
}

关于如何在后台运行但永不终止的任何想法?

1 个答案:

答案 0 :(得分:2)

您看到的行为是预期的。你有一个线程,它处于等待状态。要获得某种形式的活动,您必须让调度程序实际执行某些操作。后台线程是实现此目的的一种方法:

static void Main(string[] args)    
{
    StopMain = new ManualResetEvent(false);
    bool exit = false;

    new Thread(
        delegate 
        { 
            new RunHook(); 
            while(!exit) { Thread.Sleep(1); }                 
        }
    ).Start();

    StopMain.WaitOne();
    exit = true;
}

另一种方法是让主线程产生:

static void Main(string[] args)    
{
    StopMain = new ManualResetEvent(false);

    RunHook runHook = new RunHook(); 

    while(!StopMain.WaitOne())
    {
        Thread.Sleep(1);
    }
}

当然也有其他方式。就个人而言,我不会做这些。相反,我会向RunHook类添加一个阻塞方法,并在完成或发出信号后返回它。