关闭后Microsoft word调用C#剪贴板更改事件
在C#中的winform应用程序中,当windows剪贴板内容发生更改时,我将使用此代码执行某些操作关闭后Microsoft word调用C#剪贴板更改事件,c#,clipboard,C#,Clipboard,在C#中的winform应用程序中,当windows剪贴板内容发生更改时,我将使用此代码执行某些操作 [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool AddClipboardFormatListener(IntPtr hwnd); private const int WmClipboardupdate = 0x031
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool AddClipboardFormatListener(IntPtr hwnd);
private const int WmClipboardupdate = 0x031D;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg != WmClipboardupdate) return;
richText.Paste();
}
现在,当我从MicrosoftWord
复制一些文本时,效果很好。但问题是,当我关闭Word应用程序时,它仍会调用更改事件3次,剪贴板中的文本会粘贴到我的RichTextBox或我使用剪贴板内容的任何位置。
有人知道如何防止这种情况吗?删除您的侦听器以停止接收事件
RemoveClipboardFormatListener(hwnd);
您如何知道不相关的应用程序何时打开
private bool IsWordFileOpened()
{
bool isExist = false;
System.Diagnostics.Process[] prs = System.Diagnostics.Process.GetProcesses();
foreach (Process pr in prs)
{
if (pr.ProcessName == "WINWORD")
{
isExist = true;
break;
}
}
return isExist;
}
或者使用HCBT_destrownd订阅关闭
但这是一个黑客。我认为你可能做错了什么。我不确定我是否理解您的要求,但您应该让您的winforms应用程序在winforms应用程序的生命周期内完成这项工作。我猜每次更新剪贴板时,都会触发多个wmclipboadupdate
事件。因此,更好的方法是过滤WndProc中的消息-不要调用richText.Paste()代码>重复。有关CBTProc回调函数的信息可能会有所帮助,但您的代码不能。原因windows中可能会打开更多的WINWORD
s,并且此问题也可能发生在某些其他应用程序中。无论如何谢谢你