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); // 激活到最前
}这是主窗口代码现在改的对吗
最新发布