С# SetForegroundWindow не работает

Я ограничил мое приложение Windows С#, чтобы разрешить запуск только одного экземпляра за один раз, используя этот вопрос Как заставить приложение С#.net запускать только один экземпляр в Windows?

Он работает хорошо и не позволяет запускать одновременно несколько экземпляров приложения.

Проблема заключается в том, что если пользователь пытается открыть второй экземпляр приложения, я хочу, чтобы текущий активный был первым.

Вопрос, с которым я работал, по-видимому, касается этого, но он не работает для меня.

Я думаю, что это потому, что мое приложение не соответствует критериям, позволяющим использовать метод: SetForegroundWindow работать.

Мой вопрос: как я могу это достичь. Мой код ниже:

using System    ;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace RTRFIDListener_Client
{
    static class Program
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetForegroundWindow(IntPtr hWnd);

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool createdNew = true;

            using (Mutex mutex = new Mutex(true, "RTRFIDListener_Client", out createdNew))
            {
                if (createdNew)
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new frm_Main());
                }
                else
                {
                    Process current = Process.GetCurrentProcess();
                    foreach (Process process in Process.GetProcessesByName(current.ProcessName))
                    {
                        if (process.Id != current.Id)
                        {
                            SetForegroundWindow(process.MainWindowHandle);
                            break;
                        }
                    }
                }
            }
        }
    }
}

Ответ 1

Скручивание собственного приложения с одним экземпляром, как правило, является ошибкой,.NET Framework уже сильно поддерживает его, и он прочный и очень трудно использовать. И имеет функцию, которую вы ищете, событие StartupNextInstance, которое запускается, когда пользователь снова запускает ваше приложение. Добавьте ссылку на Microsoft.VisualBasic и создайте файл Program.cs следующим образом:

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

namespace WhatEverYouUse {
    class Program : WindowsFormsApplicationBase {
        [STAThread]
        static void Main(string[] args) {
            Application.SetCompatibleTextRenderingDefault(false);
            new Program().Start(args);
        }
        void Start(string[] args) {
            this.EnableVisualStyles = true;
            this.IsSingleInstance = true;
            this.MainForm = new Form1();
            this.Run(args);
        }
        protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) {
            eventArgs.BringToForeground = true;
            base.OnStartupNextInstance(eventArgs);
        }
    }
}

Если вы используете аргументы командной строки, которые использовались для запуска второго экземпляра, типичные, например, когда вы используете ассоциацию файлов, используйте eventArgs.CommandLine в обработчике событий.

Ответ 2

попробуйте это...

System.Threading.Tasks.Task.Factory.StartNew(() => { SetForegroundWindow(this.Handle); });