日期:2014-05-19  浏览次数:20727 次

[急]键盘事件

画面有两个按钮和一个文本编辑框和一个picturebox。
用到了键盘事件。
在里面处理回车键和→键。

如何做到以下:
1,不管焦点在那个控件上,按下回车都响应按钮2事件,即使焦点在按钮1上。
2,焦点在文本编辑框里按下→是编辑状态,除了文本框之外按下→响应按钮1事件。

现在存在问题:
1,按钮1有时获得焦点后,回车键就响应按钮1了。
2,当焦点在按钮1时,按下→时,焦点移动的按钮2。

------解决方案--------------------
必须用hook了
------解决方案--------------------
也可以用IMessageFilter

public class MsgFilter : IMessageFilter
{
public event KeyEventHandler OnKeyDown;

#region IMessageFilter Members

public bool PreFilterMessage(ref Message m)
{
if (m.Msg == 0x100)
{
KeyEventArgs e = new KeyEventArgs((Keys)m.WParam);
if (OnKeyDown != null) OnKeyDown(this, e);
}

return false;
}

#endregion
}

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
MsgFilter filter = new MsgFilter();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.AddMessageFilter(filter);
Application.Run(new Form1(filter));
Application.RemoveMessageFilter(filter);
}
}


private MsgFilter filter;

public Form1(MsgFilter filter)
{
InitializeComponent();
this.filter = filter;
filter.OnKeyDown += new KeyEventHandler(filter_OnKeyDown);
}

void filter_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Enter) MessageBox.Show( "Enter... ");
}
------解决方案--------------------
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg,System.Windows.Forms.Keys e)
{
if(e==Keys.Enter)
{
button3_Click(null ,null);
return true;
}
if(e==Keys.Right &&!textBox1.Focused)
{
button1_Click(null ,null);
return true;
}
return false;
}//try