2012-02-11 2 views
0

Я пытаюсь понять код, который блокирует некоторые клавиши на клавиатуре и позволяет использовать только некоторые пути выхода по сравнению с обычными способами.Обработанные нажатия: Понимание возвращаемого значения IntPtr

Я получил большинство из них, но есть эта часть, в которой мы фактически обрабатываем нажатия клавиш в этой функции. Вот код:

public static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
     { 
     if (nCode >= 0) 
     { 
      bool Alt = (WinForms.Control.ModifierKeys & Keys.Alt) != 0; 
      bool Control = (WinForms.Control.ModifierKeys & Keys.Control) != 0; 

      //Prevent ALT-TAB and CTRL-ESC by eating TAB and ESC. Also kill Windows Keys. 
      int vkCode = Marshal.ReadInt32(lParam); 
      Keys key = (Keys)vkCode; 

      if (Alt && key == Keys.F4) 
      { 
       Application.Current.Shutdown(); 
       return (IntPtr)1; //handled 
      } 
      if (key == Keys.LWin ||key == Keys.RWin) return (IntPtr)1; //handled 
      if (Alt && key == Keys.Tab) return (IntPtr)1; //handled 
      if (Alt && key == Keys.Space) return (IntPtr)1; //handled 
      if (Control && key == Keys.Escape)return (IntPtr)1; 
      if (key == Keys.None) return (IntPtr)1; //handled 
      if (key <= Keys.Back) return (IntPtr)1; //handled 
      if (key == Keys.Menu) return (IntPtr)1; //handled 
      if (key == Keys.Pause) return (IntPtr)1; //handled 
      if (key == Keys.Help) return (IntPtr)1; //handled 
      if (key == Keys.Sleep) return (IntPtr)1; //handled 
      if (key == Keys.Apps) return (IntPtr)1; //handled 
      if (key >= Keys.KanaMode && key <= Keys.HanjaMode) return (IntPtr)1; //handled 
      if (key >= Keys.IMEConvert && key <= Keys.IMEModeChange) return (IntPtr)1; //handled 
      if (key >= Keys.BrowserBack && key <= Keys.BrowserHome) return (IntPtr)1; //handled 
      if (key >= Keys.MediaNextTrack && key <= Keys.OemClear) return (IntPtr)1; //handled 

      Debug.WriteLine(vkCode.ToString() + " " + key); 


     } 
     return InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam); 
     } 

Что назначая boolean значение Alt с & символ означает в этой строке WinForms.Control.ModifierKeys & Keys.Alt?

Мы справились с нажатиями на клавиши, но какой вопрос о возврате из 1?

ответ

2

Значение нумерации Keys.Alt - это битовая маска, которая имеет бит, который определяет, нажата ли клавиша-модификатор Alt.

Оператор & делает побитовый и при использовании на два int или Enum значений, таким образом, что на WinForms.Control.ModifierKeys выделяющего бит для Alt ключа.

Метод возвращает IntPtr значение, так, чтобы вернуть значение 1, указывающее, что ключ был обработан, вы должны привести его к IntPtr.

+0

Я ранее использовал в одном из моих приложений с e.KeyChar == Keys.Alt в событии Keypress. Это имеет значение? – Cipher

+0

@ Cipher: это другое использование, так как тогда вы улавливаете, когда нажата клавиша Alt, тогда как свойство 'ModifierKeys' содержит ключи модификатора, которые в настоящее время удерживаются. – Guffa

0

Символ & используется для побитового and по двум аргументам. В этом случае WinForms.Control.ModifierKeys & Keys.Alt проверяет, нажата ли клавиша Alt.

Смежные вопросы