API Callback 関数の呼び出し

  EnumWindows



http://msdn.microsoft.com/ja-jp/library/cc410851.aspx

API の Callback 関数の利用では有名な関数ですが、古い Microsoft の .NET のサンプルでも
使用されていました。以下は、それをまとめたものです。

注目は、API 関数の参照名を変更する為の EntryPoint:="EnumWindows" と、
Callback 関数を呼び出す関数で使用する為の記述方法↓
New EnumWindowsCallbackNormal(AddressOf ActiveProcessListNormal)

そもそも、Delegate Function は、C++ 的に考えると、明らかに関数ポインタの型の定義なので、
その場で使用したい場合はコンストラクタで実体を作って使用し、
または変数として、関数のポインタを定義して代入した上で用いる。

結果、ページ最後のような書き方も可能だが、渡すアドレスが API 側で保存されるのであれば
良いが、こちらのメモリエリアを時間を隔ててこちら側を参照しにくる場合も想定できるので、
こちら側の static な変数にいったんセットしておくほうがいいかもしれない

  
Imports System.Runtime.InteropServices
Imports System.Text

Public Class Form1

	' ******************************************************
	' Callback 関数の定義( 通常 )
	' ******************************************************
	Public Delegate Function EnumWindowsCallbackNormal( _
	ByVal hWnd As Integer, _
	ByVal lParam As Integer) As Boolean
	' ******************************************************
	' Callback 呼び出し 関数の定義
	' ******************************************************
	<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
	 Public Shared Function EnumWindows( _
	 ByVal callback As EnumWindowsCallbackNormal, _
	 ByVal lParam As Integer) As Integer
	End Function

	' ******************************************************
	' Callback 関数の定義( 文字列引渡し用 )
	' ******************************************************
	Public Delegate Function EnumWindowsCallbackString( _
	   ByVal hWnd As Integer, _
	   ByVal lParam As String) As Boolean
	' ******************************************************
	' Callback 呼び出し 関数の定義
	' ※ 要 Ansi 文字変換 => CharSet:=CharSet.Ansi
	' ******************************************************
	<DllImport("user32.dll", EntryPoint:="EnumWindows", CharSet:=CharSet.Ansi)> _
	   Public Shared Function EnumWindowsString( _
	   ByVal callback As EnumWindowsCallbackString, _
	   ByVal lParam As String) As Integer
	End Function

	' ******************************************************
	' 情報取得用 API
	' ******************************************************
	<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
	Public Shared Function GetWindowText(ByVal hWnd As Integer, _
	 ByVal lpString As StringBuilder, _
	 ByVal nMaxCount As Integer) As Integer
	End Function

	<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
	Public Shared Function GetClassName(ByVal hwnd As Integer, _
	 ByVal lpClassName As StringBuilder, _
	 ByVal cch As Integer) As Integer
	End Function

	Const STRING_BUFFER_LENGTH As Integer = 255

	' ******************************************************
	' Callback 関数( 文字列用 )
	' ******************************************************
	Private Function ActiveProcessListString(ByVal hWnd As Integer, _
	  ByVal lParam As String) As Boolean

		Dim windowText As New StringBuilder(STRING_BUFFER_LENGTH)
		Dim className As New StringBuilder(STRING_BUFFER_LENGTH)

		GetWindowText(hWnd, windowText, STRING_BUFFER_LENGTH)
		GetClassName(hWnd, className, STRING_BUFFER_LENGTH)

		' lParam は、String
		Console.WriteLine(lParam)

		Console.WriteLine( _
		  String.Format("{0}|{1}|{2}", _
		   windowText.ToString(), _
		   className.ToString(), _
		   hWnd.ToString()) _
		  )

		Return True

	End Function

	' ******************************************************
	' Callback 関数( 通常 )
	' ******************************************************
	Private Function ActiveProcessListNormal(ByVal hWnd As Integer, _
	  ByVal lParam As Integer) As Boolean

		Dim windowText As New StringBuilder(STRING_BUFFER_LENGTH)
		Dim className As New StringBuilder(STRING_BUFFER_LENGTH)

		GetWindowText(hWnd, windowText, STRING_BUFFER_LENGTH)
		GetClassName(hWnd, className, STRING_BUFFER_LENGTH)

		' lParam は、 Integer
		Console.WriteLine(lParam)

		Console.WriteLine( _
		  String.Format("{0}|{1}|{2}", _
		   windowText.ToString(), _
		   className.ToString(), _
		   hWnd.ToString()) _
		  )

		Return True

	End Function

	' ******************************************************
	' 処理開始( 文字列を渡す )
	' ******************************************************
	Private Sub Button1_Click(ByVal sender As System.Object, _
	 ByVal e As System.EventArgs) Handles Button1.Click

		' Callback 関数のアドレスの渡し方
		EnumWindowsString( _
		 New EnumWindowsCallbackString(AddressOf ActiveProcessListString), _
		 "文字列を渡す")

	End Sub

	' ******************************************************
	' 処理開始( 通常 )
	' ******************************************************
	Private Sub Button2_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles Button2.Click

		' Callback 関数のアドレスの渡し方
		Dim func As EnumWindowsCallbackNormal = _
		 AddressOf ActiveProcessListNormal

		EnumWindows(func, 0)

	End Sub
End Class
  


  
EnumWindows( _
 CType( _
  AddressOf ActiveProcessListNormal, _
  EnumWindowsCallbackNormal _
  ), 0)
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ