【发布时间】:2010-07-13 20:15:34
【问题描述】:
我有以下情况: WinForms 应用程序,它只允许运行此应用程序的一个实例(此处使用互斥锁进行检查)。以一些参数开始的应用程序正在运行但被隐藏。当有人再次点击应用程序时,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);
}
}
一切都很好,但我还需要一个功能。 当主表单第一次取消隐藏时,我想显示另一个附加表单。通常我通过表单 _Shown 事件来完成。但是当我使用 PInvoke 方法显示窗口时,不会触发此事件。
所以基本上我想在显示主窗体时显示附加窗体(使用 ShowWindow PInvoke 方法)
这可能吗?任何其他想法如何实现它?
【问题讨论】:
-
您是否坚持使用 P/Invoke 机制来执行此操作?还有其他方法可以完全在 C# 代码中生成单实例应用程序。
-
我通过 Mutex 实现了单实例。现在,在我通过 public static extern int ShowWindow(int hwnd, int cmdShow); 显示 MainWindow 后,我坚持显示其他表单;
标签: c# winforms pinvoke winforms-interop