gpt4 book ai didi

C# SetForegroundWindow 不工作

转载 作者:太空宇宙 更新时间:2023-11-03 19:05:08 24 4
gpt4 key购买 nike

我使用这个问题 How to force C# .net app to run only one instance in Windows? 将我的 C# 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;
}
}
}
}
}
}
}

最佳答案

旋转您自己的单实例应用程序通常是一个错误,.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

关于C# SetForegroundWindow 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29260084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com