internal partial class AvcControl : UserControl
{
readonly KeyMessageFilter _filter;
public AvcControl()
{
InitializeComponent();
_filter = new KeyMessageFilter(this);
System.Windows.Forms.Application.AddMessageFilter(_filter);
}
public new void Dispose()
{
System.Windows.Forms.Application.RemoveMessageFilter(_filter);
base.Dispose();
}
protected void Esc(Control sender)
{
.....
}
class KeyMessageFilter : IMessageFilter
{
readonly AvcControl _owner;
internal KeyMessageFilter(AvcControl owner) { _owner = owner; }
private const int WM_KEYDOWN = 0x100;
bool IMessageFilter.PreFilterMessage(ref Message m)
{
if (m.Msg != WM_KEYDOWN) return false;
if (_owner == null || _owner.IsDisposed || !_owner.Visible || !_owner.ContainsFocus) return false;
Keys kc = (Keys)(int)m.WParam & Keys.KeyCode;
if (m.Msg == WM_KEYDOWN && kc == Keys.Escape)
{
Control acvive = _owner.ActiveControl;
if (acvive is TextBox || acvive is ComboBox)
{
_owner.Esc(acvive);
return true;
}
}
return false;
}
}