从静态方法使用窗体/控件时访问非静态成员错误

本文关键字:访问 静态成员 错误 控件 静态方法 窗体 | 更新日期: 2023-09-27 18:33:23

在我的一个项目中,我在一个名为 KeyboardHook 的类中有如下代码......

    private static IntPtr keyboardHookId = IntPtr.Zero;
    public static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            int vkCode = Marshal.ReadInt32(lParam);
            //update UI here...
        }
        return CallNextHookEx(keyboardHookId, nCode, wParam, lParam);
    }

我想用类似这样的语句更新 UI

    Form1.label1.Text = vkCode.ToString();

。但这会导致 C# 编译器出现问题;即访问非静态成员。
我需要创建对 Form1 对象的引用,即。

            Application.Run(new Form1());

怎么办?

从静态方法使用窗体/控件时访问非静态成员错误

在 SolutionExplorer 中打开程序.cs并在此处更改代码,如下所示

    static class Program
{
    public static Form1 mainForm = null;
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        mainForm = new Form1();
        Application.Run(mainForm);
    }
}

在这里,Form1 类的实例由 Application.Run 命令创建并启动。请注意,mainForm 在第 3 行中初始化为 null,而不是:

public static Form1 mainForm = new Form1();

这是因为在应用程序中创建第一个 IWin32Window 对象之前必须调用 Application.SetCompatibleTextRenderingDefault(( 方法,否则将引发 InvalidOperationException