WinForms:从WndProc方法(Form类)打开消息框
本文关键字:消息 Form WndProc 方法 WinForms | 更新日期: 2023-09-27 17:50:03
我想象WndProc是在另一个线程而不是主UI线程上调用的。
我是对的,所以我认为只要在表单上使用invokerrequied和Invoke就足以在UI线程上显示一个消息框。
我错了。我不明白为什么。我怎样才能绕过这个问题?我在谷歌上搜索了一下,但没有找到解决方案。
我想做的是简单地引发一个自定义事件(ClipboardUpdate)当剪贴板发生变化
消息框只是一个测试,但没有工作,而只是改变一些东西,如字符串(表单的私有字段)的工作,但这不是一件好事,因为这是一个跨线程操作在一个不安全的方式。
更新1:我这里没有代码,因为我是在一个朋友的电脑上创建的,但是我可以准确地解释我写了什么,因为很短。我用visual studio创建了一个基本的winform,没有任何东西。我使用AddClipboardFormatListener(互操作,但它很容易作为一个函数,返回int并接受IntPtr)函数(在windows 7操作系统上)来检测WM_CLIPBOARDUPDATE消息,在winproc内(一个简单的if, *if (e.s msg == clipboardexextension .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);
clipboarduupdate是一个事件,声明方式如下:
public event EventHandler<EventArgs> ClipboardUpdate;
最后,订阅ClipboardUpdate事件的唯一方法在里面有这个:
MessageBox.Show("test");
当我运行代码时会发生什么?事件被触发(我尝试了一个异常,它的工作)和消息框不弹出,但我不能再与我的表单交互,因为它的行为就像一个弹出窗口被打开(这是"正常"的行为,当你打开一个不同的线程弹出窗口,这就是为什么我说)。
对于如何解决这个问题有什么建议吗?我不明白为什么会发生这种情况,但我创建了一个新项目,从WndProc打开一个消息框工作正常,也许一些线程损坏主线程内存,我不知道这一点,但正如其他人所说的WndProc是ui线程,应该工作