3

私はWindowsデスクトッププログラミングに不慣れです(または、少なくともWindows 3.0以降はプログラミングを行っていません)。VS 2012 ExpressforDesktopをインストールしました。デフォルトのフォームベースのプロジェクトを作成して実行しています。ここで、 pinvoke.netごとに次の行を含むWindowsAPIを追加したいと思います。

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

このコードで2つのエラーが発生します。

  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を他の場所で使用しないことが確実でない限り、私はしません。 tお勧めします。

于 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 に答える