【发布时间】:2013-08-30 16:16:45
【问题描述】:
我有一个应用程序可以捕获发送到窗体的 Windows 消息,并在系统剪贴板有更新时运行一个方法:
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_CLIPBOARDUPDATE:
if (IsClipboardListenerOn)
OnClipboardChanged();
break;
}
base.WndProc(ref m);
}
在某些情况下,我不希望我的方法 OnClipboardChanged() 运行。我的解决方案是设置一个静态全局变量IsClipboardListenerOn 并根据需要切换它。这没有完成工作,因为 Windows 消息直到 在 我的函数返回后才被处理,所以它总是正确的:
private void some_event(object sender, EventArgs e)
{
MainForm.IsClipboardListenerOn = false;
// some code that makes the clipboard changed message fire
MainForm.IsClipboardListenerOn = true;
// when this returns the WM_CLIPBOARDUPDATE message gets caught
}
下一个想法是在线程上运行触发消息事件的代码并等待线程返回以确保它在全局标志关闭时执行:
Thread thread1 = new Thread(() => clipboard_stuff());
thread1.SetApartmentState(ApartmentState.STA);
MainForm.IsClipboardListenerOn = false;
thread1.Start();
thread1.Join();
MainForm.IsClipboardListenerOn = true;
但这也不起作用。事实上,有时它会执行我的 OnClipboardChanged() 方法两次。我知道系统剪贴板需要单线程单元;这是我的问题的一部分吗?我要解决这个问题了吗?我可以利用其他一些技术吗?
【问题讨论】:
标签: c# .net multithreading winforms wndproc