C#在类之间共享或修改变量

C#在类之间共享或修改变量,c#,class,timer,scope,C#,Class,Timer,Scope,所以我有两门课:定时器和钥匙钩 在Timers类中,我有一个名为DateTime类型的lastInteraction的公共变量 KeyHook类负责监听键盘事件。当前,当按下一个键时,它会打印到屏幕上 我希望KeyHook事件用当前日期时间更新lastInteraction变量,这可能吗?即使我在timer类中创建KeyHook实例,它也没有帮助 我在网上查过,但据我所知,变量不能在类之间共享,在类之间传递值也不起作用 一些代码片段: Program.cs KeyHook.cs 定时器 给Ke

所以我有两门课:定时器和钥匙钩

在Timers类中,我有一个名为DateTime类型的lastInteraction的公共变量

KeyHook类负责监听键盘事件。当前,当按下一个键时,它会打印到屏幕上

我希望KeyHook事件用当前日期时间更新lastInteraction变量,这可能吗?即使我在timer类中创建KeyHook实例,它也没有帮助

我在网上查过,但据我所知,变量不能在类之间共享,在类之间传递值也不起作用


一些代码片段:

Program.cs

KeyHook.cs

定时器


KeyHook
一个更新
lastInteraction
的委托:

class KeyHook {
    public static Action OnKey { get; set; }
    public static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) {
            int vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine((Keys)vkCode);
            if (OnKey != null) {
                OnKey();
            }
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
}
...
BeatW.Timers timer = new BeatW.Timers();
timer.startTimers();

KeyHook kh = new KeyHook();
KeyHook.OnKey = () => timer.lastInteraction = DateTime.Now;

注意:这是一种不费吹灰之力就能快速实现功能的方法。用于构建更强大的功能,允许您使用用于处理事件的C#工具添加、删除和组合事件处理程序。

KeyHook
提供更新
lastInteraction
的委托:

class KeyHook {
    public static Action OnKey { get; set; }
    public static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) {
            int vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine((Keys)vkCode);
            if (OnKey != null) {
                OnKey();
            }
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
}
...
BeatW.Timers timer = new BeatW.Timers();
timer.startTimers();

KeyHook kh = new KeyHook();
KeyHook.OnKey = () => timer.lastInteraction = DateTime.Now;

注意:这是一种不费吹灰之力就能快速实现功能的方法。用于构建更强大的功能,该功能允许您使用C#处理事件的工具添加、删除和组合事件处理程序。

如果设置静态类,则可以执行您想要的操作

public static class Timers
{
    public static DateTime lastInteraction { get; set; }
    ...
}
在KeyHook类中,您可以在其上设置值

public static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
        int vkCode = Marshal.ReadInt32(lParam);
        >>>>>Timers.lastInteraction = DateTime.Now;
        Console.WriteLine((Keys)vkCode);
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

您可以在运行时访问所有命名空间范围上的
Timers.lastInteraction
的值。

如果您设置了一个静态类,则可以执行您想要的操作

public static class Timers
{
    public static DateTime lastInteraction { get; set; }
    ...
}
在KeyHook类中,您可以在其上设置值

public static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
        int vkCode = Marshal.ReadInt32(lParam);
        >>>>>Timers.lastInteraction = DateTime.Now;
        Console.WriteLine((Keys)vkCode);
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

您可以在运行时访问所有命名空间范围上的
Timers.lastInteraction
的值。

您可以实例化
KeyHook
,但回调方法是静态的。实例是如何连接到静态回调的?相反,hook可以更新其
static
字段/属性,您可以从实例方法中读取这些字段/属性。正如其他人提到的,我也对Keyhook和Timers类是如何连接的感到困惑,但我想说的是,您可能希望Keyhook触发一个事件,并让Timers类订阅它,以便更新lastInteraction值。您实例化了
Keyhook
,但回调方法是静态的。实例是如何连接到静态回调的?相反,hook可以更新其
static
字段/属性,您可以从实例方法中读取这些字段/属性。正如其他人提到的,我也对Keyhook和Timers类是如何连接的感到困惑,但我想说的是,您可能希望Keyhook触发一个事件,并让Timers类订阅它,以便可以更新lastInteraction值。“…”后面的代码应该在Timer类还是Program类中?它来自
Program
Main
。“…”后面的代码,这应该在定时器类还是程序类中?它来自
Program
Main