Anuya
Anuya

Reputation: 8350

Problem disposing the managed resources in c# window form

In the below code, i am trying to reference an external .dll, which creates a custom taskbar in the desktop. After which i am creating tabs on the taskbar as per my requirement.

Everything works fine, but after i terminate my application for creating the taskbar, the space which is occupied by the custom taskbar is blocked. which means that, the resources are not released after exiting the application.

I am trying the force the application to dispose the unmanaged resources. But it dosent help. How to do it?? Please refer to the code below which i am trying with...

namespace Daemon {

public partial class MDIParent : ShellLib.ApplicationDesktopToolbar , IDisposable
{

    private static MDIParent MDIParentInstance = null;


    public MDIParent()
    {
        InitializeComponent();
        timer1.Interval = 50;
        timer1.Enabled = true;

    }
    int childCount = 1;
    int iHitcount = 0;


    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (components != null)
            {
                components.Dispose();
            }
        }
        base.Dispose(disposing);
    }


    private void MDIParent_FormClosed(object sender, FormClosedEventArgs e)
    {
        Taskbar.Show();
    }

    public void TabIt(string strProcessName)
    {
        //Get the collection of opened tab names and check against the new tabs.
        //If exists, dont allow to open the same tab again.

        bool found = false;

        if (Global.ExistingTabProcessNames.Count > 0)
        {
            foreach (string currentTab in Global.ExistingTabProcessNames)
            {
                if (currentTab.Equals(strProcessName))
                {
                    found = true;
                }
            }
        }

        if (found == false)
        {
            this.Show();

            //Creating MDI child form and initialize its fields
            MDIChild childForm = new MDIChild();
            childForm.Text = strProcessName;
            childForm.MdiParent = this;

            //child Form will now hold a reference value to the tab control
            childForm.TabCtrl = tabControl1;

            //Add a Tabpage and enables it
            TabPage tp = new TabPage();
            tp.Parent = tabControl1;
            tp.Text = childForm.Text;
            tp.Show();
            //child Form will now hold a reference value to a tabpage
            childForm.TabPag = tp;
            //Activate the MDI child form
            childForm.Show();
            childCount++;

            //Activate the newly created Tabpage
            tabControl1.SelectedTab = tp;
            tp.Height = tp.Parent.Height;
            tp.Width = tp.Parent.Width;
        }
    }

    private void MDIParent_Load(object sender, EventArgs e)
    {
        Edge = AppBarEdges.Top;
    } 

    [System.Runtime.InteropServices.DllImport("user32.dll")]

    private static extern int ShowWindow(IntPtr hWnd, int nCmdShow);

    private void tabControl1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
        iHitcount = iHitcount + 1;
        if (iHitcount != 1)
            BringFront(tabControl1.SelectedTab.Text.ToString());
    }

    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

    private const int SW_SHOWNORMAL = 1;
    private const int SW_SHOWMINIMIZED = 2;
    private const int SW_SHOWMAXIMIZED = 3;

    private void BringFront(string ExecutablePath)
    {
        Process[] Processes = Process.GetProcesses();

        foreach (Process clsProcess in Process.GetProcesses())
        {
            if (clsProcess.ProcessName.Contains(ExecutablePath))
            {

                ShowWindowAsync(clsProcess.MainWindowHandle, SW_SHOWMAXIMIZED);
            }
            else
            {
                ShowWindowAsync(clsProcess.MainWindowHandle, SW_SHOWMINIMIZED);
            }
        }
    }

    public static MDIParent MDIParentRef
    {
        get
        {
            if (MDIParentInstance == null)
                MDIParentInstance = new MDIParent();

            return MDIParentInstance;
        }
    }

    public void showScreen()
    {
        if (this.InvokeRequired == true)
        {
            this.Invoke(new MethodInvoker(this.showScreen));
        }
        else
        {

            this.Show();
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (Global.TabProcessNames.Count > 0)
        {
            foreach (string strProcessName in Global.TabProcessNames)
            {
                TabIt(strProcessName);
            }
        }
    } 
}

}

Upvotes: 1

Views: 570

Answers (1)

dtb
dtb

Reputation: 217283

The appbar is removed by the OnClosing event of ApplicationDesktopToolbar.

Are you using Application.Exit to exit your application? From MSDN:

The Application.Exit method does not raise the Form.Closed and Form.Closing events [...]

Upvotes: 1

Related Questions