Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用.Net Core在单个实例中更改主窗口状态_C#_Wpf_.net Core - Fatal编程技术网

C# 如何使用.Net Core在单个实例中更改主窗口状态

C# 如何使用.Net Core在单个实例中更改主窗口状态,c#,wpf,.net-core,C#,Wpf,.net Core,我正试图将我的应用程序只保留一个实例 public partial class App : Application { private static Mutex _mutex = null; protected override void OnStartup(StartupEventArgs e) { const string appName = "MyAppName"; bool createdNew; _mutex = new Mutex(t

我正试图将我的应用程序只保留一个实例

public partial class App : Application {

private static Mutex _mutex = null;

protected override void OnStartup(StartupEventArgs e)
{
    const string appName = "MyAppName";
    bool createdNew;

    _mutex = new Mutex(true, appName, out createdNew);

    if (!createdNew)
    {
        Application.Current.Shutdown();
    }

    base.OnStartup(e);
}          
代码工作正常,但我想操纵已经打开的窗口

当我打开多个实例时,如何将已打开的窗口向前移动

public partial class App : Application {

private static Mutex _mutex = null;

protected override void OnStartup(StartupEventArgs e)
{
    const string appName = "MyAppName";
    bool createdNew;

    _mutex = new Mutex(true, appName, out createdNew);

    if (!createdNew)
    {
        Application.Current.Shutdown();
    }

    base.OnStartup(e);
}          
}


OnStartup
中,我尝试使用
MainWindow.WindowState=WindowState.Normal调用窗口但调用失败,注意到错误System.Windows.Application.MainWindow.get返回null

我在WPF中为单实例应用程序创建了一个示例项目。也许有帮助:

您需要以下本机方法:

public static class NativeMethod
{
    public static IntPtr BroadcastHandle => (IntPtr)0xffff;
    public static int ReactivationMessage => RegisterWindowMessage("WM_SHOWME");

    [DllImport("user32")]
    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
    [DllImport("user32")]
    public static extern int RegisterWindowMessage(string message);
}
在应用程序主窗口中添加钩子到窗口消息,当您收到激活消息时,应将主窗口置于其他窗口的顶部。像这样:

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
        RegisterWndProcCallback();
    }

    private void RegisterWndProcCallback()
    {
        var handle = new WindowInteropHelper(this).EnsureHandle();
        var hock = new HwndSourceHook(WndProc);
        var source = HwndSource.FromHwnd(handle);

        source.AddHook(hock);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == NativeMethod.ReactivationMessage)
            ReactivateMainWindow();

        return IntPtr.Zero;
    }

    private void ReactivateMainWindow()
    {
        if (WindowState == WindowState.Minimized)
            WindowState = WindowState.Normal;

        Topmost = !Topmost;
        Topmost = !Topmost;
    }
}
public partial class App
{
    private static readonly Mutex _singleInstanceMutex =
        new Mutex(true, "{40D7FB99-C91E-471C-9E34-5D4A455E35E1}");

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        if (_singleInstanceMutex.WaitOne(TimeSpan.Zero, true))
        {
            Current.MainWindow = new MainWindow();
            Current.MainWindow.Show();
            Current.MainWindow.Activate();

            _singleInstanceMutex.ReleaseMutex();
        }
        else
        {
            NativeMethod.PostMessage(
                NativeMethod.BroadcastHandle,
                NativeMethod.ReactivationMessage,
                IntPtr.Zero,
                IntPtr.Zero);

            Current.Shutdown();
        }
    }
}
在应用程序启动时,您应该检查应用程序实例,如果需要,您应该向旧实例发送消息并激活该实例。像这样:

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
        RegisterWndProcCallback();
    }

    private void RegisterWndProcCallback()
    {
        var handle = new WindowInteropHelper(this).EnsureHandle();
        var hock = new HwndSourceHook(WndProc);
        var source = HwndSource.FromHwnd(handle);

        source.AddHook(hock);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == NativeMethod.ReactivationMessage)
            ReactivateMainWindow();

        return IntPtr.Zero;
    }

    private void ReactivateMainWindow()
    {
        if (WindowState == WindowState.Minimized)
            WindowState = WindowState.Normal;

        Topmost = !Topmost;
        Topmost = !Topmost;
    }
}
public partial class App
{
    private static readonly Mutex _singleInstanceMutex =
        new Mutex(true, "{40D7FB99-C91E-471C-9E34-5D4A455E35E1}");

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        if (_singleInstanceMutex.WaitOne(TimeSpan.Zero, true))
        {
            Current.MainWindow = new MainWindow();
            Current.MainWindow.Show();
            Current.MainWindow.Activate();

            _singleInstanceMutex.ReleaseMutex();
        }
        else
        {
            NativeMethod.PostMessage(
                NativeMethod.BroadcastHandle,
                NativeMethod.ReactivationMessage,
                IntPtr.Zero,
                IntPtr.Zero);

            Current.Shutdown();
        }
    }
}

从复制子进程使用Win32的
PostMessage
(通过其主窗口句柄)向原始进程发送消息。