willy wonka 2 Ответов: 1

Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство


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


Это дает мне следующую ошибку на Microsoft C# 2008:

Инициализатор поля не может ссылаться на скриншоты нестатического поля, метода или свойства.ScreenShotConfigurationForm.HookCallback(int, System.IntPtr, Система.IntPtr)'

Что это значит?
Как я могу ее решить?

Что я уже пробовал:

Я не знаю, что, чтобы попытаться решить проблему.

1 Ответов

Рейтинг:
7

BillWoodruff

Компилятор сообщает вам, что он не завершил компиляцию класса, и тело метода, на которое вы пытаетесь ссылаться, недоступно.

Создайте конструктор для класса и установите там ссылку на метод:

public partial class ScreenShotConfigurationForm : Form
{
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    
    private LowLevelKeyboardProc _proc; 
    
    public ScreenShotConfigurationForm()
    {
         _proc = HookCallback;
    }
    
    // ----- some other stuff (code, methods, etc...) is placed in here -----
}


willy wonka 2

Спасибо, что это работает, но: следующее Было бы лучше, потому что процедура также запустит инициализацию компонента:

публичная форма ScreenShotConfigurationForm()
{
метод InitializeComponent();
_proc = HookCallback;
}