2013-01-21 55 views
1

我有下面的代碼,它拋出一個異常NullReference當窗體失去焦點(點擊另一個程序時):如何使用'this'而不是Main.ActiveForm?

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

+5

這是爲什麼靜態的,你在哪裏調用此代碼和你有什麼特林做? –

+4

你不能......它似乎是靜態的,所以'this'沒有任何意義.. –

+0

@ sa_ddam213我編輯了我的帖子以包含更多的代碼。 –

回答

0

根據Form.ActiveForm的規範,如果程序中沒有任何表單處於活動狀態(如果其他程序具有焦點),則應該返回null。

嘗試將呼叫打包到Main.ActiveForm.Invokeif檢查以確保Main.ActiveForm不爲空。

0

作爲直接回答你的問題,按照你的代碼風格:

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

然後

public void Hook(object mainObject) 
    { 
     Main form = (Main)mainObject; 
     while(true) 
     { 
      // ... 
相關問題