using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
namespace WpfMfcInterop
{
public partial class MainWindow : Window
{
private const int WH_CALLWNDPROC = 4;
private const int WM_SIZE = 0x0005;
[StructLayout(LayoutKind.Sequential)]
private struct CWPSTRUCT
{
public IntPtr lParam;
public IntPtr wParam;
public uint message;
public IntPtr hwnd;
}
private delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll")]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
private IntPtr hookHandle;
public MainWindow()
{
InitializeComponent();
SetupHook();
}
private void SetupHook()
{
var source = HwndSource.FromHwnd(Process.GetCurrentProcess().MainWindowHandle);
source.AddHook(WndProc);
IntPtr hModule = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
hookHandle = SetWindowsHookEx(WH_CALLWNDPROC, HookCallback, hModule, 0);
}
private IntPtr HookCallback(int code, IntPtr wParam, IntPtr lParam)
{
if (code >= 0)
{
CWPSTRUCT msg = (CWPSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPSTRUCT));
if (msg.message == WM_SIZE && msg.hwnd == YourMfcWindowHandle)
{
// MFC窗口的Size消息处理
// 在这里执行你的逻辑
}
}
return CallNextHookEx(hookHandle, code, wParam, lParam);
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
// 在这里处理WPF窗口的消息
// 如果需要,可以在这里执行其他逻辑
return IntPtr.Zero;
}
private IntPtr YourMfcWindowHandle
{
get
{
// 替换为你的MFC窗口句柄获取逻辑
IntPtr mfcWindowHandle = FindWindow("YourMfcWindowClass", "YourMfcWindowTitle");
return mfcWindowHandle;
}
}
protected override void OnClosed(EventArgs e)
{
UnhookWindowsHookEx(hookHandle);
base.OnClosed(e);
}
}
}