2011-03-11 13 views
1

我試圖覆蓋user32.dll中的外部函數的行爲,因爲我不想讓某個窗口顯示出來。是否可以使用extern和override修飾符指定一個函數?

我想要做的是這樣的:

[DllImport("user32.dll")] 
    public extern override IntPtr GetSystemMenu(IntPtr hMenu, bool bRevert) 
    { 
     return new IntPtr(); 
    } 

但是這不會工作,因爲我得到了以下錯誤:

...發現覆蓋

沒有合適的方法

...不能extern和聲明主體

有什麼辦法來模擬我想要做什麼?

回答

3

如果調用GetSystemMenu的源代碼在您的控制範圍內,那麼您可以提供一個代替GetSystemMenu的替代方案,該方案在大多數情況下代表真實的代碼,但爲您的特殊情況做了一些不同的事情。

如果調用GetSystemMenu的源代碼不在您的控制範圍內,那麼您將需要使用掛鉤。在這種情況下,您需要修改user32.GetSystemMenu的行爲,這完全在您的代碼庫之外。

+0

好的,什麼是鉤子? – 2011-03-11 00:12:39

+1

查看[維基百科文章](http://en.wikipedia.org/wiki/Hooking)。 – 2011-03-11 00:14:38

2

我認爲你的問題源於你非法添加實現到外部方法聲明的事實。

C#的規範(10.6.7外部方法)規定:

因爲外部方法聲明 不提供任何實際的實現中,外部方法 的 方法體簡單地由一個分號組成。外部方法可能不是通用的。

相關問題