gpt4 book ai didi

.net - 将命令行传递给单实例应用程序的第一个实例

转载 作者:行者123 更新时间:2023-12-04 17:18:23 26 4
gpt4 key购买 nike

当用户使用注册表在 Windows 资源管理器中右键单击文件时,我已经实现了上下文菜单。文件地址将作为命令行传递给应用程序。解析它是没有问题的。

如何实现类似于“添加到 Windows Media Player 播放列表”的功能?它不会打开应用程序的另一个实例,而是在同一个打开的窗口上工作并将其添加到列表中?

最佳答案

@Plutonix 解决方案非常高效和优雅。

然而如果您的程序经过多个表格 即如果主窗体可以在程序执行期间更改,例如,如果您有一个登录窗体,然后是一个主窗体,或者一系列非模态窗体, Application.MainForm 并不总是相同的形式,并且可能事先不知道(硬编码) .

Plutonix 代码假定它是已知的并对其进行硬编码。
在这种情况下,您可能希望能够随时接收 NewArguments,无论您的应用程序中的哪种形式处于事件状态。

有 2 个解决方案扩展 Plutonix 解决方案 :

1)反复将 Application.MainForm 强制为代码中的特定表单(我尚未对此进行测试,但 Application.MainForm 是读/写的,因此它可以工作)。

2)最优雅的是在所有可能成为MainForm的表单上实现一个接口(interface):

创建基本接口(interface):

Public Interface INewArgumentsReceived
Sub NewArgumentsReceived(args As String())
End Interface

将 MyApplication_StartupNextInstance 的 @Plutonix 代码修改为:
Private Sub MyApplication_StartupNextInstance(sender As Object, e As ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
Dim f = Application.MainForm

If f.GetType.GetInterfaces.Contains(GetType(INewArgumentsReceived)) Then
CType(f, INewArgumentsReceived).NewArgumentsReceived(e.CommandLine.ToArray)
Else
MsgBox("The current program state can't receive new requests.",, vbExclamation)
End If

现在在所有可能成为主窗体的窗体上,实现 INewArgumentsReceived 接口(interface):
Public Class FormA: Implements INewArgumentsReceived

Public Sub NewArgumentsReceived(args As String()) Implements INewArgumentsReceived.NewArgumentsReceived
MsgBox("Got new arguments")
End Sub

使用接口(interface)的另一个优点是我们可以检查当前的 Application.MainForm 是否实现它并且能够接收它。

如果当前 Application.MainForm 没有实现接口(interface),它会优雅地失败并显示一条信息性消息。

关于.net - 将命令行传递给单实例应用程序的第一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28831765/

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