自分はあまり深くは理解できていないが、良さそうなとこを挙げてみる。
APIを探す
-
Windows API リスト(公式)
カテゴリー別になっており使いやすそう。※日本語のほうはリンクが切れている模様。
(やりたいことからAPI名を調べる場合は、ググったほうがはやい。)
APIを探す - SendMessageまわり
-
List Of Windows Messages - WineHQ
Windows Messageの定義名と値の表がある。 -
Build desktop Windows apps using the Win32 API - Win32 apps | Microsoft Docs
検索窓にWM_xxxxとかを入力すれば検索できる・・はず。
API定義のC#での書き方
API名が判明している前提。
-
NativeMethods.cs - Microsoft
internal classなので直接呼び出しはできないが、定義コードは参考になる。
.Netの基本機能のなかで使われているものだけが定義されているようで、網羅はされていないので注意(例えばSendMessage
がない)。
ちゃんと理解できていない(HandleRef
のあたりとかがよくわからない)ので一旦削除します。
・・・HandleRef
はこの辺公式 によるとGC対策っぽいけど型のサイズが合ってないような。。。
⇒型の扱いについては特殊なルールが適用されているよう
なお、SendMessage
のIntPtr
型のパラメータをint
で書いているようなサイトのコードは64bit環境を考慮していないので、そのままでは使わないほうがよい。(msg
パラメータはuint
(もしくはint
)だが)
属性の指定
属性([return: MarshalAs(UnmanagedType.Bool)]
みたいなの)のつけかた。
型の読み替え
.Net(C#)とWin32API(C言語)の型の対応関係
値の読み替え
C言語のNULL
は、C#のIntPtr.Zero
構造体の扱い
よく使う属性指定:[StructLayout(LayoutKind.Sequential)]
構造体内の固定長配列の扱い
よく使う属性指定:
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=要素数)]
[MarshalAs(UnmanagedType.ByValArray,SizeConst=要素数)]
共用体の扱い
Cのunion
, C#の[FieldOffset()]
には気を付けよう。