1

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

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

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

我该如何解决这个问题?我环顾谷歌,但没有找到解决方案。

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

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

更新1:

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

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

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

4

1 回答 1

1

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

于 2011-07-22T11:27:35.723 回答