如何使用Visible和ShowInTaskBar显示/隐藏应用程序为false

时间:2012-01-20 02:11:11

标签: c# .net winapi

如何显示/隐藏正在运行的应用程序:

Visible = false; 
ShowInTaskBar = false; 

使用C#?

我尝试使用以下方法失败:

ShowWindow(handle, SW_SHOWNORMAL);

但如果应用程序在上述情况下运行,则不会显示它。

UPDATE;我的风景:

我有一个应用程序(由我编写)当WindowStateFormWindowState.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指出了一些观点,这是不可能的。我希望这很清楚。 不同的方法来解决这个问题非常感谢。再次感谢!

2 个答案:

答案 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导入)设置窗口样式即可。