Получить заголовок активного окна
Я объявил следующие вызовы 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
Наконец, я получаю следующую ошибку
Не удалось найти точку входа с именем 'GetWindowText' в DLL 'USER32.DLL'
Как я могу исправить эту проблему?
1 ответ
<DllImport("USER32.DLL", EntryPoint:="GetWindowText", SetLastError:=True,
CharSet:=CharSet.Unicode, ExactSpelling:=True,
Вы настаивали на ExactSpelling. В чем проблема, есть две версии GetWindowText, экспортированные user32.dll. GetWindowTextA и GetWindowTextW. В версии A используется строка ANSI, устаревший формат строки с 8-разрядными символами, закодированными в кодовой странице по умолчанию, которая в последний раз использовалась в Windows ME. Версия W использует строку Unicode, закодированную в utf-16, собственный тип строки Windows. Маршаллер pinvoke попробует любой из них, основываясь на CharSet, но вы остановили его, используя ExactSpelling:= True. Поэтому он не может найти GetWindowText, он не существует.
Либо используйте EntryPoint:= "GetWindowTextW", либо удалите ExactSpelling.