问题描述
|
我以为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线程,应该工作