【问题标题】:Problems linking to Windows APIs in VS 2012 Express for Desktop in C#在 C# 中链接到 VS 2012 Express for Desktop 中的 Windows API 的问题
【发布时间】:2012-10-29 13:26:10
【问题描述】:

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

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

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

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

我做错了什么?

【问题讨论】:

  • 你在哪里指定的?它应该放在类定义中。
  • @CodeCaster -- 啊,呃,就是这样,谢谢。我没有把它放在课堂上。当然,在类中它可以工作。
  • 这不适用于 Winforms 应用程序。而是使用 Form.TransparencyKey 和 Opacity 属性,您将免费获得对 SetLayeredWindowAttributes() 的内部调用。将 Region 属性用于形状。
  • @HansPassant -- 好吧,考虑到所有较新的类,挂钩这些 Windows API 确实感觉很奇怪。我猜如果我最终使用 WPF 来做类似的包装器使用 WPF?

标签: c# windows pinvoke dllimport


【解决方案1】:

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

通常,您会将 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,我不会推荐它。

【讨论】:

  • 也感谢NativeMethods 的提示!
【解决方案2】:

因为你必须把这段代码封装在类上

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

}

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多