1

我有以下代码,当表单失去焦点时(单击另一个程序时)抛出 NullReference 异常:

namespace MyProg
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void Main_Load(object sender, EventArgs e)
        {
            Mouse Mouse = new Mouse();
            Thread Thread = new Thread(new ThreadStart(Mouse.Hook));
            Thread.Start();
        }

        internal static bool IsTransparent = true;
        internal static void TransparentForm()
        {
            Main.ActiveForm.TransparencyKey = (Main.IsTransparent ? Color.Firebrick : Color.AliceBlue);
        }
    }

    public class Mouse
    {
        public void Hook()
        {
            while(true)
            {
                if(Screen.AllScreens.Length > 1)
                {
                    if(Cursor.Position.X < 1300)
                    {
                        Main.IsTransparent = true;
                        Main.ActiveForm.Invoke(new MethodInvoker(Main.TransparentForm));
                    }
                    // .....
                }
            }
        }
}

我怎样才能消除Main.ActiveForm

4

2 回答 2

0

根据规范Form.ActiveForm,如果您的程序中没有任何表单处于活动状态(如果另一个程序具有焦点,就是这种情况),它应该返回 null。

尝试将调用包装在检查以确保不为空的Main.ActiveForm.Invoke内部。ifMain.ActiveForm

于 2013-01-21T14:46:02.210 回答
0

作为对您问题的直接回答,请遵循您的代码样式:

Thread Thread = new Thread(new ParameterizedThreadStart(Mouse.Hook));
        Thread.Start(this);

接着

public void Hook(object mainObject)
    {
        Main form = (Main)mainObject;
        while(true)
        {
             // ...
于 2013-01-21T16:37:22.953 回答