addDownload()
メインアプリケーションクラス内にあるメソッドMainWindow.xaml.cs
を呼び出す必要がありますApp.xaml.cs
アプリケーションに関する情報:
私
App.xaml.cs
には、アプリケーションのインスタンスを 1 つだけ実行するコードがあります。(私のコードではありません。見つけました)using System; using System.Diagnostics; using System.Reflection; using System.Runtime.InteropServices; using System.Threading; using System.Windows; using DownloadManager; namespace DownloadManager { public partial class App : Application { private static readonly Semaphore singleInstanceWatcher; private static readonly bool createdNew; static App() { // Ensure other instances of this application are not running. singleInstanceWatcher = new Semaphore( 0, // Initial count. 1, // Maximum count. Assembly.GetExecutingAssembly().GetName().Name, out createdNew); if (createdNew) { // This thread created the kernel object so no other instance // of this application must be running. } else { // This thread opened an existing kernel object with the same // string name; another instance of this app must be running now. // Gets a new System.Diagnostics.Process component and the // associates it with currently active process. Process current = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(current.ProcessName)) { if (process.Id != current.Id) { NativeMethods.SetForegroundWindow( process.MainWindowHandle); NativeMethods.ShowWindow(process.MainWindowHandle, WindowShowStyle.Restore); break; } } // Terminate this process and gives the underlying operating // system the specified exit code. Environment.Exit(-2); } } private static class NativeMethods { [DllImport("user32.dll")] internal static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] internal static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow); } /// <summary> /// Enumeration of the different ways of showing a window.</summary> internal enum WindowShowStyle : uint { Hide = 0, ShowNormal = 1, ShowMinimized = 2, ShowMaximized = 3, Maximize = 3, ShowNormalNoActivate = 4, Show = 5, Minimize = 6, ShowMinNoActivate = 7, ShowNoActivate = 8, Restore = 9, ShowDefault = 10, ForceMinimized = 11 } } }
addDownload()
アプリケーションが既に実行されているかどうかに関係なく、毎回コマンド ライン パラメータをメソッドに渡す必要があります。
私がこれまでに試したこと:
まず、App.xaml の Startup エントリ ポイントを削除して、コード ビハインド内で管理できるようにしました。
次に、アプリケーションが実行されていない場合は、MainWindow の新しいインスタンスを作成して表示します。
MainWindow MW = new MainWindow(); MW.Show();
コマンド ライン パラメータを取得し、
addDownload()
メソッドに渡します。string[] args = Environment.GetCommandLineArgs(); if(args.Length > 1) { MW.addDownload(args[1]); }
わかりました、この部分は完全に機能します。
しかし、私が言うように、アプリケーションが既に実行されている場合にも、コマンド ライン パラメータを渡す必要があります。コマンド ライン パラメーターを取得するのは以前と同じですが、それをaddDownload()
現在の MainWindow インスタンスのメソッドに渡すのはそうではなく、機能する方法を見つけるのに苦労しています。
私は試した:
try
{
var main = App.Current.MainWindow as MainWindow;
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1)
{
main.addDownload(args[1]);
}
}
catch(Exception ex)
{
MessageBox.Show(String.Format("{0}\n{1}", ex.GetType().ToString(), ex.Message));
}
しかし、私は NullReferenceException を取得します..main
宣言について考えます..Visual Studio 内でこの特定の状況をデバッグする方法がわかりません。
何か助けはありますか?私が間違っているのは何ですか?