如何显示/隐藏正在运行的应用程序:
Visible = false;
ShowInTaskBar = false;
使用C#?
我尝试使用以下方法失败:
ShowWindow(handle, SW_SHOWNORMAL);
但如果应用程序在上述情况下运行,则不会显示它。
UPDATE;我的风景:
我有一个应用程序(由我编写)当WindowState
为FormWindowState.Minimized
时,我隐藏了TaskBar的应用程序并将其置于“托盘图标模式”。
我正在使用以下方法来确保应用程序单实例:
[STAThread]
static void Main()
{
bool createdNew;
Mutex m = new Mutex(true, "...", out createdNew);
if (!createdNew)
{
Process currentProc = Process.GetCurrentProcess();
foreach (Process proc in Process.GetProcessesByName(currentProc.ProcessName))
{
if (proc.Id != currentProc.Id)
{
IntPtr handle = currentProc.Handle;
SetForegroundWindow(handle);
break;
}
}
}
else
{
Application.SetCompatibleTextRenderingDefault(false);
Application.EnableVisualStyles();
Application.Run(new Form1());
}
}
问题是,它确保单个实例正常工作,但是如果应用程序正在运行,我想要show application(托盘图标模式的退出)。
我想在应用程序中进行通信,比如从app1(1)向app2发送消息,app2读取消息为1并执行某些操作。但是我不知道这是怎么做的,ShowWindow()
在前几个小时似乎是最好的方法,但@Hans Passant指出了一些观点,这是不可能的。我希望这很清楚。
不同的方法来解决这个问题非常感谢。再次感谢!
答案 0 :(得分:3)
更改ShowInTaskbar属性会更改Handle值。它是几个Form类属性之一,只能在本机CreateWindowEx()调用中指定,以后不能更改。因此,更改属性需要Winforms重新创建窗口。这给它一个不同的句柄,使得ShowWindow()调用很可能使用了错误的值。
您没有发现这是问题,因为您没有检查ShowWindow()返回值。当您调用Windows调用时,非常很重要,当调用失败时,您没有友好的.NET异常来打击你。
答案 1 :(得分:0)
我一直在寻找如何在没有单个实例的情况下做到这一点,我刚刚找到了解决方案。
[STAThread]
static void Main()
{
string proc = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(proc);
// No form has been created
if (processes.Length <= 1)
{
Form1 form = new Form1();
Application.Run(form);
}
// Form has been created
else
{
for (int i = 0; i < processes.Length; i++)
{
IntPtr formhwnd = FindWindow(null, "Form1");// get HWND by the text name of form
// Use WIN32 methods
int style = GetWindowLong(formhwnd, GWL_EXSTYLE);// Get EX-Style of the window
style |= WS_EX_APPWINDOW;// Add the APP style that shows icon in taskbar
style &= ~(WS_EX_TOOLWINDOW);// Delete the tool style that does not show icon in taskbar
SetWindowLong(formhwnd, GWL_EXSTYLE, style);// Set the EX-Style
ShowWindow(formhwnd, SW_SHOW);// Show the Window
SwitchToThisWindow(formhwnd, true);// Focus on the window
}
}
}
如果您想显示/隐藏另一个应用程序的窗口。这个还是可以参考的。只要拿到那个窗口的句柄,用win32方法(从C++ dll导入)设置窗口样式即可。