SendMessageTimeout

private const string UNIQUE_MUTEX_ID = "YOUR_UNIQUE_APP_MUTEX_{A8F7C5E2-9B6D-4B8C-A0C7-123456789ABC}"; private Mutex _mutex; private IntPtr _hwnd; protected override void OnStartup(StartupEventArgs e) { #region 更改为单实例应用程序 // 尝试创建互斥体 bool createdNew; _mutex = new Mutex(true, UNIQUE_MUTEX_ID, out createdNew); if (!createdNew) { // 已存在实例 → 发送激活消息并退出 ActivateExistingInstance(); Shutdown(); return; } #endregion base.OnStartup(e); // 主窗口加载完成后注册句柄(稍后赋值) MainWindow.Loaded += (s, args) => { _hwnd = new WindowInteropHelper(MainWindow).Handle; User32.RegisterWindowMessage(User32.WM_ACTIVATE_APP); };这是APP的。using System; using System.Runtime.InteropServices; internal static class User32 { [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int RegisterWindowMessage(string msgName); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] public static extern bool IsIconic(IntPtr hWnd); [DllImport("user32.dll")] public static extern IntPtr SendMessageTimeout( IntPtr windowHandle, uint Msg, IntPtr wParam, IntPtr lParam, SendMessageTimeoutFlags flags, uint timeout, out IntPtr result); public static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff); public const int SW_RESTORE = 9; public const string WM_ACTIVATE_APP = "WM_ACTIVATE_GUMMING_APP"; public enum SendMessageTimeoutFlags : uint { SMTO_NORMAL = 0x0000, SMTO_BLOCK = 0x0001, SMTO_ABORTIFHUNG = 0x0002, SMTO_NOTIMEOUTIFNOTHUNG = 0x0008 } public static void BroadcastMessage(int msgId) { SendMessageTimeout( HWND_BROADCAST, (uint)msgId, IntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.SMTO_NORMAL, 1000, out _); } } 这是工具类。 // 原有的 SourceInitialized 方法保持不变,只是确保 Hook 正确注册 protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); var helper = new WindowInteropHelper(this); HwndSource.FromHwnd(helper.Handle)?.AddHook(WndProc); // 已有 Hook } void MainWindow_SourceInitialized(object sender, EventArgs e) { IntPtr hwnd = new WindowInteropHelper(this).Handle; HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc)); } private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { //txtTitle.Text = string.Format("{0}{1}{2}{3}", msg, wParam, lParam, handled); // 处理系统命令:最大化 if (msg == 0x0112)//WM_SYSCOMMAND { if ((int)wParam == 0xF030)//SC_MAXIMIZE { this.ResizeMode = ResizeMode.NoResize; this.WindowStyle = WindowStyle.None; this.WindowState = WindowState.Maximized; } } // 处理外部实例唤醒请求 var activateMsg = User32.RegisterWindowMessage(User32.WM_ACTIVATE_APP); if (msg == activateMsg) { ActivateAndBringToFront(hwnd); handled = true; // 标记已处理 return IntPtr.Zero; } return IntPtr.Zero; } // 激活并置前窗口 private void ActivateAndBringToFront(IntPtr hwnd) { if (User32.IsIconic(hwnd)) // 如果最小化,则恢复 { User32.ShowWindow(hwnd, User32.SW_RESTORE); } User32.SetForegroundWindow(hwnd); // 激活到最前 }这是主窗口代码现在改的对吗
最新发布
11-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值