- 2018-5-8
- Visual C#
Visual Studioコード分析の警告
Visual Studioには、コード分析機能がありコード分析を行うことで、コードが綺麗になる。
プログラム分析
C#で、下記のようなコードを書いて、Visual Studioのコード分析を実行すると、
警告が出た。
using System.Runtime.InteropServices;
[DllImport("USER32.DLL")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, UInt32 bRevert);
[DllImport("USER32.DLL")]
private static extern UInt32 RemoveMenu(IntPtr hMenu, UInt32 nPosition, UInt32 wFlags);
public const UInt32 SC_CLOSE = 0x0000F060;
public const UInt32 MF_BYCOMMAND = 0x00000000;
// システムメニュー(フォームの)ハンドル取得する
IntPtr hMenu = NativeMethods.GetSystemMenu( hWnd, 0 );
// [×]ボタンを無効化する。
RemoveMenu( hMenu, NativeMethods.SC_CLOSE, NativeMethods.MF_BYCOMMAND );
【警告内容】
警告 CA1060 ’GetSystemMenu(IntPtr, uint)’ は P/Invoke メソッドであるため、NativeMethods、SafeNativeMethods または UnsafeNativeMethods に名前指定されたクラスで定義しなければなりません。
なんじゃこれ?となるわけなんだけど、MSのヘルプを見ると、
「デザイン上の警告」らしい。
プログラムの修正
MSが警告するなら、修正しないと。。
でっ、上記ページのリンクから「CA1060: P/Invoke を NativeMethods クラスに移動します」を参照して修正してみた。
using System.Runtime.InteropServices;
/// <summary>
/// NativeMethods(アンマネージまとめるクラス)
/// </summary>
/// <returns>
/// MSのヘルプ確認
/// https://msdn.microsoft.com/library/ms182161.aspx
///
/// GetSystemMenu ヘルプ
/// https://msdn.microsoft.com/ja-jp/library/cc364748.aspx
///
/// RemoveMenu ヘルプ
/// https://msdn.microsoft.com/ja-jp/library/cc410998.aspx
/// </returns>
internal static class NativeMethods
{
[DllImport("USER32.DLL")]
internal static extern IntPtr GetSystemMenu(IntPtr hWnd, UInt32 bRevert);
[DllImport("USER32.DLL")]
internal static extern UInt32 RemoveMenu(IntPtr hMenu, UInt32 nPosition, UInt32 wFlags);
public const UInt32 SC_CLOSE = 0x0000F060;
public const UInt32 MF_BYCOMMAND = 0x00000000;
}
/// <summary>
/// API使ってみますクラス
/// </summary>
/// <returns>
/// MSのヘルプ確認
/// https://msdn.microsoft.com/library/ms182161.aspx
/// </returns>
public static class TestWin32Apis
{
/// <summary>
/// システムメニューの[×]ボタンを無効化する。
/// </summary>
/// <param name="hWnd">
/// ウィンドウメニューを保持しているウィンドウ(ダイアログ)のハンドルを指定する。
/// </param>
/// <returns>
/// エラーとなった場合は無視する。
///
/// </returns>
public static void TestAppRemoveMenu( IntPtr hWnd )
{
// システムメニュー(フォームの)ハンドル取得する
// 第二引数はヘルプ参照
IntPtr hMenu = NativeMethods.GetSystemMenu( hWnd, 0 );
// [×]ボタンを無効化する。
// 戻り値みてエラー処理したほうがいいよね。。
NativeMethods.RemoveMenu( hMenu, NativeMethods.SC_CLOSE, NativeMethods.MF_BYCOMMAND );
}
}
// **************************************
// 実行側
// **************************************
/// <summary>
/// ダイアログクラスのこんすとらくた
/// </summary>
/// <returns>
public frmSyaindetail()
{
InitializeComponent();
// コントロールボックスの[閉じる]ボタンの無効化実行
TestWin32Apis.TestAppRemoveMenu( this.Handle );
}
まぁ、NativeMethods に、突っ込んどけって話。
警告は、消えたらしい。











