2

次のWinAPI呼び出しを宣言しました

<DllImport("USER32.DLL", EntryPoint:="GetActiveWindow", SetLastError:=True,
    CharSet:=CharSet.Unicode, ExactSpelling:=True,
    CallingConvention:=CallingConvention.StdCall)>
Public Shared Function GetActiveWindowHandle() As System.IntPtr
End Function

<DllImport("USER32.DLL", EntryPoint:="GetWindowText", SetLastError:=True,
    CharSet:=CharSet.Unicode, ExactSpelling:=True,
    CallingConvention:=CallingConvention.StdCall)>
Public Shared Function GetActiveWindowText(ByVal hWnd As System.IntPtr, _
                                            ByVal lpString As System.Text.StringBuilder, _
                                            ByVal cch As Integer) As Integer
End Function

次に、このサブルーチンを呼び出して、アクティブウィンドウのタイトルバーのテキストを取得します

Public Sub Test()
    Dim caption As New System.Text.StringBuilder(256)
    Dim hWnd As IntPtr = GetActiveWindowHandle()
    GetActiveWindowText(hWnd, caption, caption.Capacity)
    MsgBox(caption.ToString)
End Sub

最後に、次のエラーが発生します

DLL'USER32.DLL'で'GetWindowText'という名前のエントリポイントが見つかりません

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

7
<DllImport("USER32.DLL", EntryPoint:="GetWindowText", SetLastError:=True,
    CharSet:=CharSet.Unicode, ExactSpelling:=True,

あなたはExactSpellingを主張しました。これが問題です。user32.dllによってエクスポートされるGetWindowTextには2つのバージョンがあります。GetWindowTextAおよびGetWindowTextW。Aバージョンは、WindowsMEで最後に使用されたデフォルトのコードページでエンコードされた8ビット文字を含むレガシー文字列形式であるansi文字列を使用します。Wバージョンは、ネイティブのWindows文字列型であるutf-16でエンコードされたUnicode文字列を使用します。pinvokeマーシャラーは、CharSetに基づいてどちらかを試行しますが、ExactSpelling:=Trueを使用して試行を停止しました。したがって、GetWindowTextが見つからず、存在しません。

EntryPoint:= "GetWindowTextW"を使用するか、ExactSpellingを削除します。

于 2013-02-21T12:12:41.200 に答える