从另一个线程调用控件失败,出现跨线程异常

时间:2015-05-15 00:59:58

标签: c# winforms

在Windows窗体项目中,我使用win32 api订阅全局键盘事件,当我按下win + alt + E时触发事件,在事件处理程序中我有这段代码:

    _rectangle = new ScreenBoundingRectangle();
    _rectangle.Location = Location;
    _rectangle.Visible = true;

我保留一个变量到我的矩形,现在基于一些逻辑,我想隐藏矩形,所以我使用这行代码将可见性设置为false:

    _rectangle.Visible = false;

然而,我得到了着名的交叉线程异常,即使我尝试这个:

this.Invoke(new MethodInvoker(() =>
    {
        _rectangle.Visible = false;
    }));

我仍然得到交叉线程异常!

<_> _rectangle没有调用方法,还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

仅适用于使用VisualUIAVerify库且会遇到此问题的任何人:

下载开源并将其添加到ScreenBoundingRectangle的Visiable属性

        public bool Visible
        {
            get { return this._visible; }
            set
            {
                this._visible = value;

                if (value)
                    SafeNativeMethods.ShowWindow(_form.Handle, 8);
                else
                {
                    //Here invoke _form:
                    this._form.Invoke(new MethodInvoker(() =>
                    {
                        _form.Hide();
                    }));

                }
            }
        }