WinForms:从WndProc方法打开一个消息框(Form类)

时间:2011-04-14 09:29:12

标签: c# winforms multithreading wndproc

我想象WndProc是在另一个线程而不是主UI线程上调用的。

我是对的,所以我认为只需在表单上使用InvokeRequired和Invoke即可在UI线程上显示消息框。

我错了。我不明白为什么。

我怎样才能解决这个问题?我在谷歌周围寻找但没有找到解决方案。

我想要做的只是在剪贴板更改时提升自定义事件(ClipboardUpdate)

消息框只是一个测试,但没有工作,只是改变像字符串(表单的私有字段)之类的东西,但这不是一件好事,因为这是一个不安全的跨线程操作方式。

更新1:

我这里没有代码,因为我是在朋友的电脑上创建的,但是我可以准确地解释我写的内容因为很简短。 我用visual studio创建了一个基本的winform,没有任何东西。 我使用AddClipboardFormatListener(互操作,但它很容易作为一个函数,返回int并接受IntPtr)函数(在Windows 7操作系统上)只检测winproc内的WM_CLIPBOARDUPDATE消息(一个简单的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");

运行代码时会发生什么?该事件被触发(我尝试了一个异常并且它有效)并且消息框没有弹出,但是我不能再与我的表单进行交互,因为它的行为就像弹出窗口一样(这是“正常”行为时你在另一个线程上打开一个弹出窗口,这就是我说的原因。)

关于如何解决这个问题的任何建议?

1 个答案:

答案 0 :(得分:1)

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