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

コードスタイルに従って、質問への直接的な回答として:

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 に答える
0

の仕様によると、Form.ActiveFormプログラム内のどのフォームもアクティブでない場合 (別のプログラムにフォーカスがある場合)、null を返すことになっています。

null でないことを確認するためにMain.ActiveForm.Invoke、への呼び出しを にラップしてみてください。ifMain.ActiveForm

于 2013-01-21T14:46:02.210 に答える