以下のシナリオがあります:このアプリの1つのインスタンスのみを実行できるWinFormsアプリ(ここではMutexを使用してチェックしています)。いくつかのパラメータで開始したアプリは実行されていますが、非表示になっています。誰かがアプリをもう一度クリックすると、Mutexはアプリがすでに実行されていることを検出し、ネイティブメソッドを呼び出してメインフォームを「再表示」します(以下のメソッドBringWindowToFrontを参照)。
フォームウィンドウを見つけて表示するコードは次のとおりです。
public static class NativeMethods
{
public enum ShowWindowOptions
{
FORCEMINIMIZE = 11,
HIDE = 0,
MAXIMIZE = 3,
MINIMIZE = 6,
RESTORE = 9,
SHOW = 5,
SHOWDEFAULT = 10,
SHOWMAXIMIZED = 3,
SHOWMINIMIZED = 2,
SHOWMINNOACTIVE = 7,
SHOWNA = 8,
SHOWNOACTIVATE = 4,
SHOWNORMAL = 1
}
[DllImport("user32.dll")]
public static extern int ShowWindow(int hwnd, int cmdShow);
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
public static void BringWindowToFront(string windowTitle)
{
// Get a handle to the application.
IntPtr handle = FindWindow(null, windowTitle);
// Verify that app is a running process.
if (handle == IntPtr.Zero)
{
return;
}
// With this line you have changed window status from example, minimized to normal
ShowWindow((int)handle, (int)ShowWindowOptions.SHOWDEFAULT);
// Make app the foreground application
SetForegroundWindow(handle);
}
}
すべて問題ありませんが、まだ1つの機能が必要です。メインフォームが最初に再表示されるときに、別の追加フォームを表示したいと思います。通常、私はフォーム_Shownイベントによってそれを行います。しかし、PInvokeメソッドを使用してウィンドウを表示すると、このイベントは発生しません。
したがって、基本的に、メインフォームが表示されたときに追加のフォームを表示したいと思います(ShowWindow PInvokeメソッドを使用)
これは可能ですか?それを達成する方法の他のアイデアはありますか?