常時起動しているアプリケーションで起動時にウィンドウを裏に隠しておきます。2重起動時に最初に隠しておいたウィンドウを最前面に表示させたい場合があります。これを行うことで、あたかも起動が速く見せる効果もあります。特に大きなデータを扱うためにデータを読み込まなければならないときにたびたび使っています。
サンプルプログラム
App.xaml
<Application x:Class="SmartDiag.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SmartDiag"
StartupUri="MainWindow.xaml"
Startup="Application_Startup">
<Application.Resources>
</Application.Resources>
</Application>
App.xaml.cs
Startupしたときに自分と同じ名前のプロセスを探します。起動しているプロセスが見つかったら、そのプロセスを前面にし、自分はShutdownします。
private void Application_Startup(object sender, StartupEventArgs e)
{
Process currentProcess = Process.GetCurrentProcess(); // 現在のプロセスの取得
Process[] processes = Process.GetProcessesByName(currentProcess.ProcessName); // 自分のプロセスと同じ名前のプロセスを取得
foreach (Process p in processes)
{
if (p.Id != currentProcess.Id) // 同じ名前のプロセスが存在するとき
{
// 既に起動しているウィンドウを前面に表示する
ShowWindow(p.MainWindowHandle, SW_SHOWNORMAL);
SetForegroundWindow(p.MainWindowHandle);
SetWindowPos(p.MainWindowHandle, HWND_TOPMOST, 0, 0, 400, 300, 0x0040);
// 起動を中止してプログラムを終了
this.Shutdown();
}
}
}
MainWindow.xaml.cs
起動時にウィンドウを隠しておきます。
System.Windows.Interop.WindowInteropHelper _helper = null;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// 起動時にウィンドウを隠す
_helper = new System.Windows.Interop.WindowInteropHelper(this);
SetWindowPos(_helper.Handle, new IntPtr(1), 0, 0, 0, 0, 0x0010);
Application.Current.MainWindow.Height = 1;
Application.Current.MainWindow.Width = 1;
:
}