自作プログラムの二重起動の防止の際、既に起動しているプロセスのウィンドウをアクティブにさせようとしましたが、Process.MainWindowHandle がどういうわけかゼロ(IntPtr.Zero)を返してしまいます。
調べたところ、Process.MainWindowHandle は、対象のウィンドウの ShowInTaskbar が無効だとゼロを返してしまうようです。結局 FindWindow で同名のウィンドウを探すことにしました。
using System.Runtime.InteropServices;
:
:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool SetForegroundWindow(System.IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
public static bool ActivateExistingProcess() {
IntPtr hWnd = FindWindow(null, "CommandTwig");
if (hWnd != IntPtr.Zero) {
SetForegroundWindow(hWnd);
return true;
}
else
return false;
}
同名のウィンドウなんて他には無いでしょうけど、クラス名の指定なり、プロセス ID の比較なりしたほうがいいのかもしれません。
Comment Form