日期:2014-05-17  浏览次数:20951 次

子窗体激活时,如何让父窗体不再执行键盘事件响应
我做了两个窗体,父窗体中设置了一个KeyUp事件响应函数,只希望它对父窗体激活时的键盘操作作出响应,但是现在发现子窗体激活时,键盘事件被父窗体捕获了,这是我不希望发生的。具体的代码如下:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

//示例代码中我在MainForm上放置了这些东西:
// 一个TextBox,用来显示Enter键被按过的次数
// 一个Button,弹出一个MessageBox或者子窗体,当MessageBox弹出是,我希望按下Enter键仅仅是令MessageBox关闭,而不是让MainForm也执行一遍KepUp响应函数

namespace KeyupTest
{
  public partial class MainForm : Form
  {
    private int enterCount = 0; // 按下Enter键次数累计

    public MainForm()
    {
      InitializeComponent();
    }

    private void btnMessageShow_Click(object sender, EventArgs e)
    {
      MessageBox.Show("在消息框弹出的时候,希望主窗体不再执行Keyup响应");
    }


    private void MainForm_KeyUp(object sender, KeyEventArgs e)
    {
      if (e.KeyCode == Keys.Enter)
      {
        this.tbxEnterCount.Text = (++enterCount).ToString();
      }
    }

  }
}


程序界面参考这个就行了

------解决方案--------------------
MainForm中加一段:

protected override bool ProcessKeyEventArgs(ref Message m)
{
if (m.HWnd == btnMessageShow.Handle && m.WParam == (IntPtr)Keys.Enter)
return false;
else
return base.ProcessKeyEventArgs(ref m);
}