2017-08-01 24 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