2014-10-20 53 views
-3

我用下面的代碼靜態字段初始有效:關鍵字「這個」是不是一個靜態屬性,靜態方法,或

public partial class ThisAddIn 
{ 
    private const int WH_KEYBOARD_LL = 13; 
    private const int WM_KEYDOWN = 0x0100; 

    private static IntPtr hookId = IntPtr.Zero; 
    private delegate IntPtr HookProcedure(int nCode, IntPtr wParam, IntPtr lParam); 
    private static HookProcedure procedure = HookCallback; 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr GetModuleHandle(string lpModuleName); 

    [DllImport("user32.dll", SetLastError = true)] 
    private static extern bool UnhookWindowsHookEx(IntPtr hhk); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr SetWindowsHookEx(int idHook, HookProcedure lpfn, IntPtr hMod, uint dwThreadId); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 

    private void ThisAddIn_Startup(object sender, System.EventArgs e) 
    { 
     hookId = SetHook(procedure); 

    } 

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
    { 
     UnhookWindowsHookEx(hookId); 
    } 

    private static IntPtr SetHook(HookProcedure procedure) 
    { 
     using (Process process = Process.GetCurrentProcess()) 
     using (ProcessModule module = process.MainModule) 
      return SetWindowsHookEx(WH_KEYBOARD_LL, procedure, GetModuleHandle(module.ModuleName), 0); 
    } 

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
     { 
      int pointerCode = Marshal.ReadInt32(lParam); 
      string pressedKey = ((Keys)pointerCode).ToString(); 

      //Do some sort of processing on key press 
      var thread = new Thread(() => 
      { MessageBox.Show(pressedKey); 
       if (pressedKey.Equals("Space") || pressedKey.Equals("Tab")) 
        { 
         ***Word.Range rng = this.Application.ActiveDocument.Words.Last; 
         rng.Select(); 
         rng.Copy(); 
         String input = Clipboard.GetText(TextDataFormat.Text); 
        }    
      }); 
      thread.Start(); 

     } 
     return CallNextHookEx(hookId, nCode, wParam, lParam); 
    } 

    private void InternalStartup() 
    { 
     this.Startup += new System.EventHandler(ThisAddIn_Startup); 
     this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); 
    } 
} 

我得到了標有*線下面的錯誤**:

錯誤1關鍵字'this'在靜態屬性,靜態 方法或靜態字段初始值設定項中無效。

請指點

+3

這是一個非常糟糕的標題。它沒有解釋你的問題。 [請寫一個更好的。](http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title) – 2014-10-20 06:50:45

回答

-1

不能在靜態方法使用this

+0

它沒有幫助 – Shiva 2017-05-18 11:34:47

0

HookCallback靜態方法this關鍵字是一個問題:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
    { 
     int pointerCode = Marshal.ReadInt32(lParam); 
     string pressedKey = ((Keys)pointerCode).ToString(); 

     //Do some sort of processing on key press 
     var thread = new Thread(() => 
     { MessageBox.Show(pressedKey); 
      if (pressedKey.Equals("Space") || pressedKey.Equals("Tab")) 
       { 

        ***Word.Range rng = this.Application.ActiveDocument.Words.Last; 
        rng.Select(); 
        rng.Copy(); 
        String input = Clipboard.GetText(TextDataFormat.Text); 
       }    
     }); 
     thread.Start(); 

    } 
    return CallNextHookEx(hookId, nCode, wParam, lParam); 
} 

如果Application.ActiveDocument不是一個靜態的上下文中可用(即不無this在它前面的工作),那麼您將需要傳遞你需要的值。

+0

我必須通過字符串按鍵到ThisAddIn_Startup ..我該怎麼做? – 2014-10-20 07:00:04

相關問題