c#消息过滤器保持"泄漏"按下前2个键

时间:2016-03-14 01:01:13

标签: c# filter message autocad

我正在使用.net api开发autocad的小扩展程序。

我尝试使用IMessageFilter过滤密钥。它有点像#34;作品。 问题是,它的泄漏"我按下前两个键...然后开始工作。 我不确定错误发生的位置(尝试在autodesk论坛发布此内容无效)。

至于" ps2" ,它是autocads" paletteset"的一个实例。容纳UserControls以适应acad图形界面的对象。

我很感激为什么只有前两个键泄露的原因,或者为什么会发生这种情况的方法。

这是我的代码:

[CommandMethod("TestCheck")]
public void MyTab() 
{
    filter = new MyMessageFilter(ps1, ps2);
    filter.OnNumber+=filter_OnNumber;
    ...
}

private bool keyboardFilterEnabled = false;

public bool KeyboardFilterEnabled
{
    get { return keyboardFilterEnabled; }
    set
        {
            keyboardFilterEnabled = value;

            if (keyboardFilterEnabled == true)
                System.Windows.Forms.Application.AddMessageFilter(filter);
            else
                System.Windows.Forms.Application.RemoveMessageFilter(filter);
        }
    }
}

public delegate void NotifyParentDelegate(Keys source);
public class MyMessageFilter : IMessageFilter
{
    public MyMessageFilter(PaletteSet p1, PaletteSet p2)
        : base()
    {
        PaletteSet ps1 = p1;
        PaletteSet ps2 = p2;
    }


    public event NotifyParentDelegate OnNumber;
    public event NotifyParentDelegate OnLetter;
    public event NotifyParentDelegate OnControl;

    public const int WM_KEYDOWN = 0x0100; 
    public bool PreFilterMessage(ref Message m)
    {

        if (m.Msg == WM_KEYDOWN)
        {
            // Check for the Escape keypress
            Keys kc = (Keys)(int)m.WParam & Keys.KeyCode;
            if (m.Msg == WM_KEYDOWN && kc == Keys.Escape)
            {
                return false;
            }

            if (m.Msg == WM_KEYDOWN && char.IsDigit((char)kc) == true)
            {
                OnNumber(kc);
                return false;
            }
            return true;
        }
        return false;
    }
}


    public void filter_OnNumber(Keys source)
    {
        ps2.Focus();
        if (ps2.KeepFocus != true)
        {ps2.KeepFocus=true; }

        formDimensions.input_dimension.Focus();
        //SendKeys.Send(source.ToString());
    }

0 个答案:

没有答案