WinForms:从WndProc方法窗体类打开一个消息框

问题描述

| 我以为WndProc是在另一个线程而不是主UI线程上调用的。 我是对的,因此我认为仅在表单上使用Invokerequired和Invoke就足以在UI线程上显示消息框。 我错了。而且我不明白为什么。 我该如何解决这个问题?我环顾了Google,但没有找到解决方案。 我想做的只是在剪贴板更改时引发一个自定义事件(ClipboardUpdate) 消息框只是一个测试,但没有起作用,而只是更改了诸如字符串(表单的私有字段)之类的内容就可以了,但是这种行为并不是一件好事,因为这是一个跨线程操作。不安全的方法。 更新1: 我这里没有代码,因为我是在朋友的计算机上创建的,但是我可以确切解释我写的内容,因为很短。 我用Visual Studio创建了基本的Winform,没有任何东西。 我在Windows 7操作系统上使用AddClipboardFormatListener(互操作,但是作为函数相当简单,返回int并接受IntPtr)函数(在Windows 7 OS上)仅在Winproc(简单的if,* if(e.Msg == ClipboardExtension.WM_CLIPBOARDUPDATE)DoClipboardUpdate(); *)。 现在,DoClipboardUpdate执行此操作:
if (Invokerequired)
    Invoke(new VoidDelegate(OnClipboardUpdate));//Void delegate it\'s a delegate that doesn\'t take
    // Params and returns void
else
    OnClipboardUpdate();
很容易吧? OnClipboardUpdate只需执行以下操作:
if (ClipboardUpdate != null) ClipboardUpdate(null,EventArgs.Empty);
ClipboardUpdate是通过以下方式声明的事件:
public event EventHandler<EventArgs> ClipboardUpdate;
最后,订阅ClipboardUpdate事件的唯一方法内部是这样的:
MessageBox.Show(\"test\");
运行代码时会发生什么?事件被触发(我尝试了一个异常,它可以工作)并且消息框没有弹出,但是我无法再与表单交互,因为它的行为就像打开了一个弹出窗口(这是“正常”当您在其他线程上打开弹出窗口时,就会出现\“行为,这就是我这么说的原因。 关于如何解决这个问题的任何建议?     

解决方法

我不明白为什么会这样,但是我创建了一个新项目,并从WndProc打开消息框工作正常,也许某些线程损坏了主线程内存,我不知道这一点,但是正如其他人所说,wndproc是ui线程,应该工作