add ClipboardHook

This commit is contained in:
NaBian committed 2019-08-21 00:08:16 +08:00
1 parent ec9020fe1c
commit a9720f080b
4 files changed
+55 -2

No files matched your search

@@ -6,7 +6,7 @@
<SharedGUID>c4694269-c9b8-45d5-87f8-d0088c532510</SharedGUID>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<Import_RootNamespace>HandyControlDemo_Shared</Import_RootNamespace>
<Import_RootNamespace>HandyControlDemo</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)App.xaml.cs">
@@ -6,7 +6,7 @@
<SharedGUID>aac11083-faca-405d-9197-5c1212d65656</SharedGUID>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<Import_RootNamespace>HandyControl_Shared</Import_RootNamespace>
<Import_RootNamespace>HandyControl</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)Controls\Attach\BackgroundSwitchElement.cs" />
@@ -271,6 +271,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Tools\Helper\SingleOpenHelper.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Tools\Helper\ValidateHelper.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Tools\Helper\VisualHelper.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Tools\Hook\ClipboardHook.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Tools\Hook\KeyboardHook.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Tools\Hook\MouseHook.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Tools\Interop\BitmapHandle.cs" />
@@ -0,0 +1,43 @@
using System;
using System.Windows;
using System.Windows.Interop;
using HandyControl.Tools.Interop;
namespace HandyControl.Tools
{
public class ClipboardHook
{
private static HwndSource HWndSource;
private static IntPtr HookId = IntPtr.Zero;
public static event Action ContentChanged;
public static void Start()
{
if (HookId != IntPtr.Zero)
{
Stop();
}
HookId = new WindowInteropHelper(new Window()).EnsureHandle();
HWndSource = HwndSource.FromHwnd(HookId);
if (HWndSource != null)
{
HWndSource.AddHook(WinProc);
NativeMethods.AddClipboardFormatListener(HookId);
}
}
public static void Stop() => NativeMethods.RemoveClipboardFormatListener(HookId);
private static IntPtr WinProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
{
if (msg == NativeMethods.WM_CLIPBOARDUPDATE)
{
ContentChanged?.Invoke();
}
return IntPtr.Zero;
}
}
}
@@ -46,6 +46,7 @@ namespace HandyControl.Tools.Interop
WM_MBUTTONDOWN = 0x0207,
WM_MBUTTONUP = 0x0208,
WM_MBUTTONDBLCLK = 0x0209,
WM_CLIPBOARDUPDATE = 0x031D,
WM_USER = 0x0400,
TB_GETBUTTON = WM_USER + 23,
TB_BUTTONCOUNT = WM_USER + 24,
@@ -223,5 +224,13 @@ namespace HandyControl.Tools.Interop
[DllImport(ExternDll.User32)]
public static extern IntPtr GetDesktopWindow();
[DllImport(ExternDll.User32, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool AddClipboardFormatListener(IntPtr hwnd);
[DllImport(ExternDll.User32, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool RemoveClipboardFormatListener(IntPtr hwnd);
}
}