我想在我的WPF应用程序中添加监视剪贴板更改的功能。 但我也想过滤我的应用程序中发生的剪贴板更改。 所以我在其中一个主视图模型中编写了以下代码, 这个VM继承自
Conductor<IScreen>
<>的Caliburn.Micro。
代码:
protected override void OnActivate()
{
base.OnActivate();
ScreenExtensions.TryActivate(ChildWindow);
BuildClipboard();
GotoLogin();
}
private void BuildClipboard()
{
_windowHandle = (new WindowInteropHelper(Application.Current.MainWindow)).EnsureHandle();
_hWndSource = HwndSource.FromHwnd(_windowHandle);
_hWndSource.AddHook(new HwndSourceHook(WndProc));
SetClipboardViewer(_windowHandle);
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
try
{
if (_windowHandle == hwnd && msg == WM_DRAWCLIPBOARD)
{
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
/////
}
}
}
catch(Exception
{
///
}
}
protected override void OnDeactivate(bool close)
{
_hWndSource.RemoveHook(new HwndSourceHook(WndProc));
_windowHandle = IntPtr.Zero;
ScreenExtensions.TryDeactivate(ChildWindow, close);
base.OnDeactivate(close);
....
}
我有一些问题: 第一,行
if (_windowHandle == hwnd && msg == WM_DRAWCLIPBOARD)
无助于获得我想要的行为。出于某种原因,即使我从Word而不是从我的应用程序复制内容,hwnd总是具有相同的int值。 第二个问题,每次我重新启动我的应用程序时,当我的应用程序启动时,它会获得WndProc方法,其中包含我在重新启动应用程序之前创建的副本的值。诅咒这不是我想要的行为。
我希望你能帮助我, 谢谢,Anat