VB.NET で APIを使用するときの注意事項を過去の経験に基づき述べておきます。VB.NETでは Integer変数が32bit、Ling 変数が64bitとなるので、VB6で使っていたLong変数はIntegerに変えるとよい。ただし次のような問題があります。
1.GetWindowRectで次のような使い方をすると警告メッセージがでます。ここではAdobe Readerが起動されていて Button1を押してそのウインドウの左上の位置座標と右下の位置座標を取得するプログラムを想定しています。
' (module1.vb) Public Structure RECT Public Left As Integer Public Top As Integer Public Right As Integer Public Bottom As Integer End Structure Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Integer, ByVal lpRect As RECT) As Integer Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Integer ' (Form1.vb) Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim strClassName As String = "AcrobatSDIWindow" Dim fWB As RECT Dim intHwnd As Integer intHwnd = FindWindow(strClassName, vbNullString) gWB = New RECT Call GetWindowRect(intHwnd, gWB) MsgBox("Window Left=" & Str(gWB.Left) & ", Top=" & Str(gWB.Top) & _ ", Right=" & Str(gWB.Right) & ", Bottom=" & Str(gWB.Bottom) End Subこの場合、プログラムは走りますが "PInvokeStackImbalanceが検出されました" という警告メッセージが出ます。呼び出し規約、または PInmvoke シグネチュアのパラメータ不一致があり、スタックを不安定にしている旨の警告です。これを直すには Module1 でGetWindowRect Libの定義の中で byVal lpRect As RECT → ByRef lpRect As RECT と書き換え
Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Integer, ByRef lpRect As RECT) As Integerとすれば警告は消えます。API32 で使われているRECT はデータ仕様がどこか違うらしいのです。