С# 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); });