2009-09-03 5 views
1

以下のコードで、デスクトップにカスタムタスクバーを作成する外部.dllを参照しようとしています。その後、自分の要件に従ってタスクバーにタブを作成しています。管理対象リソースをC#ウィンドウフォームに配置する際の問題

すべてうまくいきますが、タスクバーを作成するアプリケーションを終了すると、カスタムタスクバーが占有する領域がブロックされます。これは、アプリケーションを終了した後にリソースが解放されないことを意味します。

私はアプリケーションに強制的にアンマネージドリソースを処分しようとしています。しかし、それは役立つdosent。 する方法? アプリケーションバーApplicationDesktopToolbarOnClosingイベントによって除去された名前空間のデーモン {

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

...と私はしようとしていた下のコードを参照してください。

アプリケーションを終了するのにApplication.Exitを使用していますか? MSDNから:

Application.Exit方法はForm.ClosedForm.Closingイベントを発生しません[...]

+0

これは、バックグラウンドで実行されるWindowsベースのアプリケーションです。したがって、ユーザーがアプリケーションを終了したい場合、彼はtaskmanagerから.exeを削除します。 – Anuya

+0

これは見ましたか? http://stackoverflow.com/questions/679214 – dtb

+0

質問は似ていますが、ソリューションは提供されていません。 私はアプリケーションのためにグローバルに処理する方がよいでしょう。 – Anuya

関連する問題