2009-09-03 77 views
1

在下面的代码中,我试图引用一个外部.dll,它在桌面上创建一个自定义任务栏。之后,我按照我的要求在任务栏上创建选项卡。在c#窗口中处理托管资源的问题

一切工作正常,但我终止我的应用程序创建任务栏后,被自定义任务栏占用的空间被阻止。这意味着资源在退出应用程序后不会被释放。

我试图强制应用程序来处置非托管资源。但它帮助。 怎么做?请参考下面对此我试图用代码...

命名空间守护 {

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); 
      } 
     } 
    } 
} 

}

回答

1

appbarOnClosing事件的ApplicationDesktopToolbar删除。

您是否在使用Application.Exit退出您的应用程序?从MSDN

Application.Exit方法不提高Form.ClosedForm.Closing事件[...]

+0

这是在后台运行一个基于Windows的应用程序。所以,如果用户想要退出应用程序,他会从taskmanager中杀死.exe。 – Anuya 2009-09-03 02:44:38

+0

你看过吗? http://stackoverflow.com/questions/679214 – dtb 2009-09-03 02:49:58

+0

是的,这个问题是类似于我的,但没有解决方案提供。 Orelse,如果我在全球范围内处理应用程序会更好。 – Anuya 2009-09-03 02:57:22