2017-08-10 29 views
-2

Iフォームに次のコードを持っている:フィールド初期化子は非静的フィールド、メソッド、またはプロパティを参照することはできません

:マイクロソフトC#2008で私に次のようなエラーを与えている

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); 
    } 
} 

フィールドの初期化は、非静的フィールド、メソッド、またはプロパティ '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

それは何を意味するのでしょうか?

エラーは言った:それはフィールドprivate LowLevelKeyboardProc _procに言及だ

A field initializer

。これは静的ではないフィールドです。初期化部分は= 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日間このような問題を解決しようとしていた...と解決策は非常に明らかだった...信じられないほどの種類...ありがとう本当に! –

関連する問題

 関連する問題