2017-08-10 42 views
-2

我有下面的代碼到窗體:一個字段初始不能引用非靜態字段,方法或屬性

using System; 
using System.Diagnostics; 
using System.Drawing; 
using System.IO; 
using System.Media; 
using System.Reflection; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace ScreenShots 
{ 
    public partial class ScreenShotConfigurationForm : Form 
    { 

     // ----- some other stuff (code, methods, etc...) is placed in here ----- 

     private const int WH_KEYBOARD_LL = 13; 
     private const int WM_KEYDOWN = 0x0100; 
     private LowLevelKeyboardProc _proc = HookCallback; // <<<< This is the row that is causing the error 
     private IntPtr _hookID = IntPtr.Zero; 

     private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
     { 
      if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
      { 
       int vkCode = Marshal.ReadInt32(lParam); 
       if (vkCode == 44) // 44 is the key code of PrintScreen button 
       { 
        MakeScreenShot(); 
       } 
      } 

      return CallNextHookEx(_hookID, nCode, wParam, lParam); 
     } 

     private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); 

     private IntPtr SetHook(LowLevelKeyboardProc proc) 
     { 
      using (Process curProcess = Process.GetCurrentProcess()) 

      using (ProcessModule curModule = curProcess.MainModule) 
      { 
       return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); 
      } 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     [return: MarshalAs(UnmanagedType.Bool)] 

     private extern bool UnhookWindowsHookEx(IntPtr hhk); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private extern IntPtr GetModuleHandle(string lpModuleName); 
    } 
} 

這是給我在微軟C#2008以下錯誤:

甲字段初始不能引用非靜態字段,方法或屬性 'ScreenShots.ScreenShotConfigurationForm.HookCallback(INT,System.IntPtr,System.IntPtr)'

  1. 是什麼意思?
  2. 我該如何解決呢?

的我所看到的截圖: enter image description here

+4

如果該方法需要現有的形式來開展工作,那麼*它不應該是靜態的*。如果方法的*行爲*是*假設*做它的工作在一個新的形式,而不是一些現有的形式,然後創建一個新的形式是(根據定義)是正確的。 – Servy

+0

如果該方法不需要一個實例來完成它的工作,將其設置爲靜態(和/或將其移出該類)。 – Blorgbeard

+0

*這意味着我必須在每次調用該方法時實例化一個窗體或圖標的新實例* - 不需要 'var myForm = new MyForm1();' 如果您有上述代碼,則您可以使用變量'myForm'調用任何非靜態方法 – Subbu

回答

0

是什麼意思?

錯誤說:

A field initializer

它指的是外地private LowLevelKeyboardProc _proc。這是一個非靜態的領域。初始化程序部分是= HookCallback;

cannot reference the non-static field, method, or property 'HookCallback'

HookCallback是一個非靜態方法和字段初始化器顯然是指它。

被禁止在這裏的事情是實例成員正在與其它實例成員初始化。由於它們都是「同時」初始化的 - 當實例被創建時 - 它們在被初始化時不應該互相引用。

這件事情,在C#編譯器實際上可以在理論上弄清楚 - 該規範定義了初始化運行特定的順序 - 但無論出於何種原因,設計師與錯誤信息,而不是去了。

你如何解決這個問題?

這只是字段初始值設定項不允許訪問實例成員。您可以在構造,其字段初始化之後運行訪問實例成員。所以,只要將初始化構造函數(如recommended by Microsoft):

private LowLevelKeyboardProc _proc; 

public ScreenShotConfigurationForm() 
{ 
    InitializeComponent(); 
    _proc = HookCallback; 
} 
+0

Yeaaooohhh !!!非常感謝:我試圖解決這個問題至少5天徒勞無功......解決方案非常明顯......有種令人難以置信的......非常感謝! –

相關問題