【问题标题】:C# share or modify variables between classesC# 在类之间共享或修改变量
【发布时间】:2018-01-08 12:17:09
【问题描述】:

所以我有 2 个类:Timers 和 KeyHook。

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

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

我希望 KeyHook 事件用当前的 DateTime 更新 lastInteraction 变量,这可能吗?即使我在计时器类中创建 KeyHook 实例也无济于事。

我怎样才能做到这一点,我在网上搜索过,但据我所知,一个变量不能在类之间共享,并且在类之间传递值是行不通的。


一些代码sn-ps:

Program.cs

static void Main(string[] args)
{
    BeatW.Timers timer = new BeatW.Timers();
    timer.startTimers();

    KeyHook kh = new KeyHook();

    Console.ReadKey();
}

KeyHook.cs

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);
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

Timers.cs

class Timers
{
    public DateTime lastInteraction;
    ...
}

【问题讨论】:

  • 你实例化了KeyHook,但是回调方法是静态的。实例如何连接到静态回调?
  • 相反,hook 可以更新其static 字段/属性,您可以从实例方法中读取。
  • 像其他人提到的那样,我也很困惑您的 Keyhook 和 Timers 类是如何连接的,但我想说您可能希望 Keyhook 触发一个事件并让 Timers 类订阅它所以可以更新 lastInteraction 值。

标签: c# class timer scope


【解决方案1】:

如果你设置一个静态类,就可以做你想做的事。

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 的值。

【讨论】:

    【解决方案2】:

    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# events 构建更强大的功能,让您可以使用 C# 工具添加、删除和组合事件处理程序以处理事件。

    【讨论】:

    • “...”后面的代码,应该是Timer类还是Program类?
    • 来自ProgramMain
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2013-07-26
    • 1970-01-01
    • 2018-04-25
    • 2011-09-14
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多