我有一个应用程序捕获发送到窗体的 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() 方法两次。我知道系统剪贴板需要单线程单元;这是我的问题的一部分吗?我要解决这个问题了吗?还有其他一些我可以利用的技术吗?