.NET Framework環境からWindows APIを呼び出す - DllImport宣言を利用 - C#

.NET Framework環境(.NET Framework のバイナリ)からWindows APIを呼び出す方法、コードを紹介します。

概要

.NET Framework ではネイティブのバイナリーコードではなく、中間コード(CIL バイトコード)のバイナリのため、Windows APIを直接呼び出すことはできません。.NET Framework のバイナリからWindows APIを呼び出す場合は、Windows APIが実装されている DLLファイルをインポートし、呼び出すWindows API 関数を DllImportにより宣言する必要があります。

方法

.NET Framework 環境から Windows APIを呼び出す場合には DllImport属性を用いてWindows APIをインポートします。

DllImport の定義はどこで調べられるのか?

Windows APIを.NET Framework 場ナイル(C#のプログラム)から呼び出したい場合、Windows APIの関数名は分かるが、DLLImportの書き方がわからないことが多々あります。DllImportの宣言は、pinvoke.net(http://www.pinvoke.net/)のサイトで検索できます。API名からDLLImportの定義が検索できますので、比較的簡単にDLLImportの宣言方法がわかります。

プログラム例

UI

以下のUIを作成します。

コード

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace CallMessageBox
{
  public partial class Form1 : Form
  {
    /// <summary>
    /// Represents possible values returned by the MessageBox function.
    /// </summary>
    public enum MessageBoxResult : uint
    {
      Ok = 1,
      Cancel,
      Abort,
      Retry,
      Ignore,
      Yes,
      No,
      Close,
      Help,
      TryAgain,
      Continue,
      Timeout = 32000
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern MessageBoxResult MessageBox(
      IntPtr hWnd, String text, String caption, int options);
    
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      MessageBox(this.Handle, "テストメッセージ", "タイトル", 0);
    }
  }
}

解説

今回のプログラムは、Windows APIの"MessageBox"APIを呼び出しWindows APIでダイアログボックスを表示するプログラムです。
  [DllImport("user32.dll", CharSet = CharSet.Auto)]
  public static extern MessageBoxResult MessageBox(
    IntPtr hWnd, String text, String caption, int options);
にて、DllImpoer属性を用いてWindows APIをインポートします。

  private void button1_Click(object sender, EventArgs e)
  {
    MessageBox(this.Handle, "テストメッセージ", "タイトル", 0);
  }
MessageBox Windows APIを呼び出しメッセージボックスを表示します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]を押すとダイアログボックスが表示されます。


C#のプログラムから、Windows APIを呼び出すことができました。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2012-07-12
iPentec all rights reserverd.