2011-03-11 30 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外部方法)规定:

因为外部方法声明 不提供任何实际的实现中,外部方法 的 方法体简单地由一个分号组成。外部方法可能不是通用的。

相关问题