2013-02-21 1 views
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 

Наконец, я получить следующее сообщение об ошибке

Не удается найти точку входа с именем «GetWindowText» в DLL «USER32.DLL»

Как исправить эту проблему?

+0

Попробуйте изменить CharSet: = CharSet.Auto – Steve

+0

[this] (http://vbtab.blogspot.com/2013/11/how-to-get-title-of-currently-active-window-in-vb -net.html) работал для меня. – Jasir

ответ

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

Вы настояли на ExactSpelling. В чем проблема, есть две версии версий GetWindowText, экспортированных пользователем32.dll. GetWindowTextA и GetWindowTextW. Версия A использует строку ansi, унаследованный формат строки с 8-битными символами, закодированными на кодовой странице по умолчанию, которая в последний раз использовалась в Windows ME. Версия W использует строку Unicode, закодированную в utf-16, собственный тип строки Windows. Маршрутизатор pinvoke попробует любой из них, основываясь на CharSet, но вы остановили его при использовании ExactSpelling: = True. Поэтому он не может найти GetWindowText, его не существует.

Либо использовать EntryPoint: = «GetWindowTextW» или отказаться от ExactSpelling.