2017-08-01 123 views
-1

所以我有2类:定时器和KeyHook。C#共享或修改类之间的变量

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

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

我希望KeyHook事件用当前的DateTime更新lastInteraction变量,这可能吗?即使我在定时器类中创建了KeyHook实例,它也没有帮助。

我怎样才能实现这样的事情,我在网上学习,但据我所知,变量不能跨类共享,并且在类之间传递值是行不通的。


一些代码片段:

的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; 
    ... 
} 
+0

您实例化'KeyHook',但回调方法是静态的。实例如何连接到静态回调? – dasblinkenlight

+0

相反,hook可以更新它的'static' field/property,你可以从实例方法中读取它。 – Sinatr

+0

像其他人一样,我也对你的Keyhook和Timers类是如何连接感到困惑,但我想说你可能希望Keyhook启动一个事件并让Timers类订阅它,以便lastInteraction值可以更新。 –

回答

0

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

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

1

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#工具添加,移除和组合事件处理程序来处理事件。

+0

“...”之后的代码应该在Timer类或Program类中吗? – user6879072

+0

它来自'Program'的'Main'。 – dasblinkenlight