2014-01-29 5 views
-1

Я новый C#, я использую код ниже, но код не работает для клавиши Enter и клавиши Tab. Пожалуйста, решить эту проблему ...C# - невозможно обработать событие ввода и табуляции

private void Panel_Load(object sender, EventArgs e) 
{ 
    this.KeyDown += new KeyEventHandler(C_event); 
} 

private void C_event(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     Label1.Text = "Enter Key"; 
     return; 
    } 
    if (e.keyCode == Keys.Tab) 
    { 
     Label1.text = "Tab Key"; 
     return; 
    } 

    label1.text = "Default"; 
} 
+0

только как намек, попробовать другой вид события, может быть что-то вроде Keypressed сделать работу. – Rafa

+0

Пожалуйста, посмотрите на ссылку SO http://stackoverflow.com/questions/10641721/c-sharp-unable-to-capture-enter-key?rq=1 –

+0

http://stackoverflow.com/questions/3752451/ enter-key-press-event-handler –

ответ

1

Для иметь возможность регулировать Ввод/Tab ключ Пресес вы должны переопределить метод ProcessCmdKey

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (!this.ProcessKey(msg, keyData)) 
     { 
      return base.ProcessCmdKey(ref msg, keyData); 
     } 
     return false; 
    } 

    protected virtual bool ProcessKey(Message msg,Keys keyData) 
    { 
     if ((keyData & Keys.Enter) == Keys.Enter) 
     { 
      Label1.Text = "Enter Key"; 
      return true; 
     } 
     if ((keyData & Keys.Tab) == Keys.Tab) 
     { 
      Label1.Text = "Tab Key"; 
      return true; 
     } 
     return false; 
    } 
1

MSDN documentation довольно ясно по этому вопросу:

Некоторые клавиши, такие как TAB, RETURN,, клавиши ESC со стрелками и обрабатываются с помощью элементов управления автоматически ,

Чтобы эти клавиши поднимали событие KeyDown, вы должны переопределить метод IsInputKey в каждом элементе управления вашей формы.

0

Вы должны установить KeyPreview свойство вашего Form в True.

Попробуйте:

private void Panel_Load(object sender, EventArgs e) 
{ 
    this.KeyPreview= true; //add this line 
    this.KeyDown += new KeyEventHandler(C_event); 
} 
+0

Хотя это правда, [вы не должны использовать 'KeyPreview' хотя] (http://stackoverflow.com/questions/2386695/disadvantage-of-setting-form-keypreview-true) , – CodeCaster

-2
// Structure contain information about low-level keyboard input event 
    [StructLayout(LayoutKind.Sequential)] 
    private struct KBDLLHOOKSTRUCT 
    { 
     public Keys key; 
     public int scanCode; 
     public int flags; 
     public int time; 
     public IntPtr extra; 
    } 

    //System level functions to be used for hook and unhook keyboard input 
    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool UnhookWindowsHookEx(IntPtr hook); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp); 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr GetModuleHandle(string name); 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern short GetAsyncKeyState(Keys key); 

    //Declaring Global objects 
    private IntPtr ptrHook; 
    private LowLevelKeyboardProc objKeyboardProcess; 

    private IntPtr CaptureKey(int nCode, IntPtr wp, IntPtr lp) 
    { 
     if (nCode >= 0) 
     { 
      KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT)); 
      if (objKeyInfo.key == Keys.Tab || objKeyInfo.key == Keys.Enter) // Disabling Windows keys 
      { 
       MessageBox.Show("TAB or Enter PRESSED"); 
       return (IntPtr)1; 
      } 

     } 
     return CallNextHookEx(ptrHook, nCode, wp, lp); 
    } 
    public Form1() 
    { 
     InitializeComponent(); 


     //Get Current Module 
     ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule; 
     //Assign callback function each time keyboard process 
     objKeyboardProcess = new LowLevelKeyboardProc(CaptureKey); 
     //Setting Hook of Keyboard Process for current module 
     ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0); 
    } 
+1

Просто демпинг кода - это не ответ, а крючок с клавиатурой - особенно плохой способ решить эту проблему, поэтому -1. – CodeCaster

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