3

我是 Windows 桌面编程的新手(或者至少我从 Windows 3.0 开始就没有做过)。我已经安装了 VS 2012 Express for Desktop。我创建并运行了一个基于表单的默认项目。现在我想添加一个 Windows API,每个 pinvoke.net包含以下行:

[DllImport("user32.dll")]
static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);

我收到此代码的两个错误:

  1. 修饰符“extern”对此项目无效(在属性的右方括号上)
  2. 预期的类、委托、枚举、接口或结构(on bool

我究竟做错了什么?

4

2 回答 2

5

确保将此声明放在类定义中,而不是在它之外。

通常,您会将 P/Invokes 保存在一个名为 的静态类NativeMethods中,然后您可以使用类似的调用来调用它NativeMethods.SetLayeredWindowedAttributes(...)。例如:

internal static class NativeMethods
{
    [DllImport("user32.dll")]
    public static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
}

如果你想在没有类型引用的情况下调用它,那么你需要把它放在你调用它的同一个类中,但除非你确定你不会在其他任何地方使用这个 P/Invoke,否则我不会不推荐它。

于 2012-10-29T13:29:45.040 回答
1

因为您必须将此代码封装在类上

class MainClass 
{
   [DllImport("user32.dll")]
   static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
   .....

}
于 2012-10-29T13:32:03.180 回答