2014-09-11 54 views
0

我想在usercontrol中捕获父窗体的keyup事件。我使用ProcessCmdKey,但它只是给我keydown事件,并没有在keyup事件中引发。我该怎么做?在用户控制中如何捕捉Keyup事件?

更新:我想捕捉窗体的keyup事件。因为在控制集中时引发Control.KeyUp。

public partial class ExtendedButton : Button 
{ 
    const int WM_KEYDOWN = 0x100; 

    public ExtendedButton() 
    { 
     InitializeComponent(); 
    } 

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (msg.Msg == WM_KEYUP && keyData == (Keys.NumPad0)) 
     { 
      MessageBox.Show("hi"); 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 
+1

为什么这么复杂?请参阅http://stackoverflow.com/questions/18604633/catch-keyup-event-on-winform-c-sharp – user2864740 2014-09-11 04:20:07

+0

@ user2864740我想在usercontrol中使用keyup事件而不是以 – ArMaN 2014-09-11 04:23:33

+1

的形式存在[Control.KeyUp]( http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keyup(v=vs.110).aspx)..仍然不知道什么是复杂的。 – user2864740 2014-09-11 04:24:43

回答

1

您可以在UserControl的OnHandleCreated覆盖方法中为父窗体KeyUp创建处理程序。

试试这个代码

Form parentForm = null; 
private void ParentForm_KeyUp(object sender, KeyEventArgs e) 
{ 
    MessageBox.Show("HI"); 
} 

protected override void OnHandleCreated(EventArgs e) 
{ 
    if (DesignMode) 
     return; 

    base.OnHandleCreated(e); 
    object parent = this; 
    while (true) 
    { 
     parent = ((Control)parent).Parent; 
     if (parent.GetType().BaseType.Name == "Form") 
      break; 
    } 
    parentForm = (Form)parent; 
    parentForm.KeyUp -= new KeyEventHandler(this.ParentForm_KeyUp); 
    parentForm.KeyUp += new KeyEventHandler(this.ParentForm_KeyUp); 
} 
+0

它不适合我! – ArMaN 2014-09-11 04:46:15

+0

发生了什么?获取任何错误?你是否将父窗体的'KeyPreview'属性设置为true? – Shell 2014-09-11 04:49:09

+0

是的,我设置KeyPreview属性。没有错误,但没有引发keyup事件。 – ArMaN 2014-09-11 04:51:38