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