2014-09-04 49 views
2

試圖改變方法名稱也試圖創建新的類,並從form1代碼,但沒有任何工作。我該如何修復錯誤:t類型Form1'已經使用相同的參數類型定義了一個名爲'Dispose'的成員?

這是在Form1的代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using VirtualBox; 
using System.Runtime.InteropServices; 

namespace Desktop 
{ 
    public partial class Form1 : Form 
    { 

     #region DLLs 
     [DllImport("user32.dll")] 
     private static extern IntPtr CreateDesktop(string lpszDesktop, IntPtr lpszDevice, IntPtr pDevmode, 
                int dwFlags, long dwDesiredAccess, IntPtr lpsa); 

     [DllImport("user32.dll")] 
     private static extern bool SwitchDesktop(IntPtr hDesktop); 

     [DllImport("user32.dll", EntryPoint = "CloseDesktop", CharSet = CharSet.Unicode, SetLastError = true)] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     public static extern bool CloseDesktop(IntPtr handle); 

     [DllImport("user32.dll")] 
     public static extern bool SetThreadDesktop(IntPtr hDesktop); 

     [DllImport("user32.dll")] 
     public static extern IntPtr GetThreadDesktop(int dwThreadId); 

     [DllImport("kernel32.dll")] 
     public static extern int GetCurrentThreadId(); 
     #endregion 

     #region Enumeratoren 
     [Flags] 
     internal enum DESKTOP_ACCESS_MASK : uint 
     { 
      DESKTOP_NONE = 0, 
      DESKTOP_READOBJECTS = 0x0001, 
      DESKTOP_CREATEWINDOW = 0x0002, 
      DESKTOP_CREATEMENU = 0x0004, 
      DESKTOP_HOOKCONTROL = 0x0008, 
      DESKTOP_JOURNALRECORD = 0x0010, 
      DESKTOP_JOURNALPLAYBACK = 0x0020, 
      DESKTOP_ENUMERATE = 0x0040, 
      DESKTOP_WRITEOBJECTS = 0x0080, 
      DESKTOP_SWITCHDESKTOP = 0x0100, 

      GENERIC_ALL = (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU | 
          DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK | 
          DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP), 
     } 
     #endregion 

     public Form1() 
     { 
      InitializeComponent(); 

      Desktop("MyDesktop"); 
      System.Threading.Thread.Sleep(1000); 
      Application.DoEvents(); 
      Desktop(); 
      Application.DoEvents(); 
      System.Threading.Thread.Sleep(3000); 
      SwitchToOrginal(); 
      Application.DoEvents(); 
     } 


     public void Dispose() 
     { 
      SwitchToOrginal(); 
      ((IDisposable)this).Dispose(); 
     } 

     /// <summary> 
     /// Unterklassen können hier die Funktionalität der Objektzerstörung erweitern. 
     /// </summary> 
     /// <param name="fDisposing"></param> 
     protected virtual void Dispose(bool fDisposing) 
     { 
      if (fDisposing) 
      { 
       // Hier die verwalteten Ressourcen freigeben 
       //BspVariable1 = null; 
       CloseDesktop(DesktopPtr); 
      } 
      // Hier die unverwalteten Ressourcen freigeben 
     } 

     void IDisposable.Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); //Fordert das System auf, den Finalizer für das angegebenen Objekt nicht aufzurufen 
     } 

     #region Variablen 
     IntPtr _hOrigDesktop; 
     public IntPtr DesktopPtr; 
     private string _sMyDesk; 
     public string DesktopName 
     { 
      get 
      { 
       return (_sMyDesk); 
      } 
      set 
      { 
       _sMyDesk = value; 
      } 
     } 
     #endregion 

     #region Konstruktoren 
     public void Desktop() 
     { 
      _sMyDesk = ""; 
     } 

     public void Desktop(string sDesktopName) 
     { 
      _hOrigDesktop = GetCurrentDesktopPtr(); 
      _sMyDesk = sDesktopName; 
      DesktopPtr = CreateMyDesktop(); 
     } 
     #endregion 

     #region Methoden 
     public void show() 
     { 
      SetThreadDesktop(DesktopPtr); 
      SwitchDesktop(DesktopPtr); 
     } 

     public void SwitchToOrginal() 
     { 
      SwitchDesktop(_hOrigDesktop); 
      SetThreadDesktop(_hOrigDesktop); 
     } 

     private IntPtr CreateMyDesktop() 
     { 
      return CreateDesktop(_sMyDesk, IntPtr.Zero, IntPtr.Zero, 0, (long)DESKTOP_ACCESS_MASK.GENERIC_ALL, IntPtr.Zero); 
     } 

     public IntPtr GetCurrentDesktopPtr() 
     { 
      return GetThreadDesktop(GetCurrentThreadId()); 
     } 
     #endregion 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 


    } 
} 

的錯誤是在這條線在Form1.designer.cs:

protected override void Dispose(bool disposing) 

試圖在這裏和在Form1改變方法的名字,但它沒有工作。

+1

什麼是你想「修復」沒有錯誤,你試圖實現處置,而它已經完成,爲什麼你想添加自己的處置代碼? – 2014-09-04 09:03:45

回答

4

已經有一個名爲Dispose的方法定義了,檢查設計器生成的代碼。

從form1.cs文件中刪除Dispose ...您是否注意到公共部分類行在那裏?這意味着該課程分佈在2個或更多文件中。所以Dispose已經在form1.designer.cs中定義了。所以不要創建另一個Dispose,或者如果你真的必須刪除「partial」。

7

尼爾是正確的它是一個部分,

如果你需要做一些工作,而配置你可以使用一些事件,如OnDispose,處置+ = ...等等爲好。處理func很奇怪。在設計器文件中自動生成。即使您更改設計器文件,它也會再次生成。因此,您無法覆蓋此重載方法。只是,你可以調用它像這樣this.Dispose(真正的); ...

使用這個,如果你處理別的事情,

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.Disposed += (s, a) => 
      { 
       //Dispose unmanaged stuffs etc. 
      }; 
    } 

順便說一句,我已經刪除designer.cs方法測試後不會導致Windows窗體應用程序的重新生成。所以這將是可能的解決方案。以及。大多數代碼生成器在事情發生變化時替換設計器文件。如EntityCode生成器,SL生成的代碼。

+3

與設計師混淆是一個非常糟糕的主意,尤其是因爲即使您更改頁面上的任何控件(即使是單個像素),也可以在窗體設計器打開時按下「保存」來重新生成文件。這就是爲什麼每個設計師的標題都有警告 – 2014-09-04 09:25:54

+0

當然Panagiotis Kanavos,這就是我的意思。這不是一個正確的方法。我只是看到它對於WinForm設計師來說行爲有所不同。很有趣。在右側的上下文菜單中也沒有運行自定義工具。如果您查看cs的屬性,則Forms沒有CustomTool集 – 2014-09-04 09:32:35

相關問題