【问题标题】:Only instances per user in the same session windows同一会话窗口中每个用户仅实例
【发布时间】:2014-07-04 11:23:57
【问题描述】:

同一会话窗口中每个用户仅实例。

我正在制作一个可供多个用户进入的程序,但我只能为每个用户打开一个实例。问题是如何检查它是否已经在运行该用户的某个实例并将其带到前台应用程序,但为该用户尝试进入而打开。

我正在尝试分配或找出活动系统进程的 ID 或可以记录和读取的东西,以便在应用程序启动时检查该用户是否已经在运行某个实例。

我现在正在使用 Diagnostics.Process.GetProcessesByName (Diagnostics.Process.GetCurrentProcess.ProcessName) 但只值得拥有一个正在运行的实例。

【问题讨论】:

  • 你在用什么? vb.Net 还是 c#?什么类型的程序? wpf? winform?

标签: c# vb.net process


【解决方案1】:

我之前也遇到过类似的问题。我正在创建一个应用程序,我只想运行一个实例。然后我创建了一个

这就是我将如何解决它。 我创建了一个 WCF 管道服务:

[ServiceContract]
interface DNRIService 
{
    [OperationContract]
    void OpenDnt(string path);

    [OperationContract]
    void OpenPak(string path);

    [OperationContract]
    bool IsOnline();

    [OperationContract]
    void Activate();


}

然后我这样做了:

public Main(String [] args) : this()
{
    try
    {
        using (ChannelFactory<DNRIService> serviceFactory = new ChannelFactory<DNRIService>(new NetNamedPipeBinding(), new EndpointAddress(PipeService)))
        {
            var channel = serviceFactory.CreateChannel();
            if(channel.IsOnline())
            {
                foreach (var argument in args)
                {
                    var argTrim = argument.Trim() ;
                    if (argTrim.EndsWith(".dnt"))
                        channel.OpenDnt(argument);
                    else if (argTrim.EndsWith(".pak"))
                        channel.OpenPak(argument);
                }
                channel.Activate();
                Close();
            }
        }
    }
    catch
    {
        @this = new ServiceHost(this, new Uri(PipeName));
        @this.AddServiceEndpoint(typeof(DNRIService), new NetNamedPipeBinding(), PipeService);
        @this.BeginOpen((IAsyncResult ar) => @this.EndOpen(ar), null);

        foreach (var argument in args)
        {
            var argTrim = argument.Trim();
            if (argTrim.EndsWith(".dnt"))
                OpenDnt(argument);
            else if (argTrim.EndsWith(".pak"))
                OpenPak(argument);
        }
    }
}

请注意,它会尝试使用相同的名称打开。如果它不能,那么它会关闭并假设另一个已经打开。然后它会尝试将其参数发送给原始的。

只需稍作修改即可获取当前用户。 这个问题应该可以帮助您: How do I get the current username in .NET using C#?

其余的由你来实现。如果您想查看我在此处发布的完整代码:

https://github.com/Aelphaeis/Dragon-Nest-Resource-Inspector

(运行它会让您了解它在只允许单个实例的情况下是如何工作的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多