在 WPF 中打开关联文件,例如 'notepad ++ tab features'
open associated files like 'notepad ++ tab features' in WPF
这个问题是关于 WPF 应用程序的。
我想用我的自定义应用程序打开一些关联文件。
我找到了打开关联文件的方法。
但是,我仍然不知道如何处理重复的应用程序。
例如,
如果我点击 'a.txt2',我的应用程序会打开它。
然后我点击 'a2.txt2',它也打开了我的应用程序的另一个进程。
我只想在第一个应用程序中获得第二次点击信息,而不是在关联文件被多次点击时我的应用程序的执行情况。
它类似于 'notepad ++' 打开文件到选项卡功能。
这是我的代码。
1 MainWindow.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainContainer_Loaded);
}
void MainContainer_Loaded(object sender, RoutedEventArgs e)
{
string fn = "x";
if (Application.Current.Properties["ArbitraryArgName"] != null)
{
fn = Application.Current.Properties["ArbitraryArgName"].ToString();
}
this.Title = fn;
}
}
2 app.xaml
<Application x:Class="sample.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Application.Resources>
</Application.Resources>
<!--
StartupUri="MainWindow.xaml"
Startup="App_Startup"--></Application>
3 app.cs
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
// Check if this was launched by double-clicking a doc. If so, use that as the
// startup file name.
string fname = "No filename given";
if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null
&& AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Length > 0)
{
try
{
fname = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
// It comes in as a URI; this helps to convert it to a path.
Uri uri = new Uri(fname);
fname = uri.LocalPath;
this.Properties["ArbitraryArgName"] = fname;
}
catch
{
// For some reason, this couldn't be read as a URI.
// Do what you must...
}
}
string procName = Process.GetCurrentProcess().ProcessName;
// get the list of all processes by the "procName"
Process[] processes = Process.GetProcessesByName(procName);
if (processes.Length > 1)
{
MessageBox.Show(procName + " already running");
//App a = new App();
//a.Shutdown();
}
else
{
}
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
base.OnStartup(e);
}
}
谢谢。
使用可用于 "Microsoft.VisualBasic" 命名空间的底部单例实例技术:
using System;
namespace Sample
{
public class Startup
{
[STAThread]
public static void Main(string[] args)
{
SingleInstanceApplicationWrapper wrapper = new SingleInstanceApplicationWrapper();
wrapper.Run(args);
}
}
public class SingleInstanceApplicationWrapper :
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
public SingleInstanceApplicationWrapper()
{
// Enable single-instance mode.
this.IsSingleInstance = true;
}
// Create the WPF application class.
private WpfApp app;
protected override bool OnStartup(
Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
{
app = new WpfApp();
app.Run();
return false;
}
// Direct multiple instances
protected override void OnStartupNextInstance(
Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs e)
{
if (e.CommandLine.Count > 0)
{
((MainWindow)app.MainWindow).openFile(e.CommandLine[0]);
}
}
}
public class WpfApp : System.Windows.Application
{
protected override void OnStartup(System.Windows.StartupEventArgs e)
{
base.OnStartup(e);
// Load the main window.
MainWindow main = new MainWindow();
this.MainWindow = main;
main.Show();
// Load the document that was specified as an argument.
if (e.Args.Length > 0) main.openFile(e.Args[0]);
}
}
}
这个问题是关于 WPF 应用程序的。 我想用我的自定义应用程序打开一些关联文件。 我找到了打开关联文件的方法。 但是,我仍然不知道如何处理重复的应用程序。
例如, 如果我点击 'a.txt2',我的应用程序会打开它。 然后我点击 'a2.txt2',它也打开了我的应用程序的另一个进程。
我只想在第一个应用程序中获得第二次点击信息,而不是在关联文件被多次点击时我的应用程序的执行情况。 它类似于 'notepad ++' 打开文件到选项卡功能。
这是我的代码。
1 MainWindow.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainContainer_Loaded);
}
void MainContainer_Loaded(object sender, RoutedEventArgs e)
{
string fn = "x";
if (Application.Current.Properties["ArbitraryArgName"] != null)
{
fn = Application.Current.Properties["ArbitraryArgName"].ToString();
}
this.Title = fn;
}
}
2 app.xaml
<Application x:Class="sample.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Application.Resources>
</Application.Resources>
<!--
StartupUri="MainWindow.xaml"
Startup="App_Startup"--></Application>
3 app.cs
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
// Check if this was launched by double-clicking a doc. If so, use that as the
// startup file name.
string fname = "No filename given";
if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null
&& AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Length > 0)
{
try
{
fname = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
// It comes in as a URI; this helps to convert it to a path.
Uri uri = new Uri(fname);
fname = uri.LocalPath;
this.Properties["ArbitraryArgName"] = fname;
}
catch
{
// For some reason, this couldn't be read as a URI.
// Do what you must...
}
}
string procName = Process.GetCurrentProcess().ProcessName;
// get the list of all processes by the "procName"
Process[] processes = Process.GetProcessesByName(procName);
if (processes.Length > 1)
{
MessageBox.Show(procName + " already running");
//App a = new App();
//a.Shutdown();
}
else
{
}
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
base.OnStartup(e);
}
}
谢谢。
使用可用于 "Microsoft.VisualBasic" 命名空间的底部单例实例技术:
using System;
namespace Sample
{
public class Startup
{
[STAThread]
public static void Main(string[] args)
{
SingleInstanceApplicationWrapper wrapper = new SingleInstanceApplicationWrapper();
wrapper.Run(args);
}
}
public class SingleInstanceApplicationWrapper :
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
public SingleInstanceApplicationWrapper()
{
// Enable single-instance mode.
this.IsSingleInstance = true;
}
// Create the WPF application class.
private WpfApp app;
protected override bool OnStartup(
Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
{
app = new WpfApp();
app.Run();
return false;
}
// Direct multiple instances
protected override void OnStartupNextInstance(
Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs e)
{
if (e.CommandLine.Count > 0)
{
((MainWindow)app.MainWindow).openFile(e.CommandLine[0]);
}
}
}
public class WpfApp : System.Windows.Application
{
protected override void OnStartup(System.Windows.StartupEventArgs e)
{
base.OnStartup(e);
// Load the main window.
MainWindow main = new MainWindow();
this.MainWindow = main;
main.Show();
// Load the document that was specified as an argument.
if (e.Args.Length > 0) main.openFile(e.Args[0]);
}
}
}