Невозможно установить результат FindWindow для переменной в .NET - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь использовать API FindWindow, используя Visual Studio 2017 (.NET Framework 4.6.1) и VB.NET, чтобы получить дескриптор окна для текущего запущенного экземпляра Microsoft Word.Я обнаружил, что, хотя он работал в прошлом (и работает в другой области кода) в одном конкретном случае, хотя вызов FindWindow возвращает значение, я не могу назначить его переменной.Я проверил это в режиме отладки (доступны скриншоты).Я пытаюсь понять, почему вызов API не работает в данном конкретном случае.

Ссылка на снимок экрана: https://imgur.com/a/NuwpUyz

Я выполнил этот вызов в некоторых областях кода .NET, которым я являюсьработая, поэтому я знаю, что это работает.Я изменил тип в определении переменной "assignee" (с Object, на Integer, на IntPtr и т. Д. И т. Д.) И перезапустил приложение с теми же результатами (переменная "assignee" заканчиваетсянулевое значение, но сам вызов FindWindow возвращает целочисленное значение, которое выглядит как правильный дескриптор окна.

Определение API FindWindow:


<DllImport("user32.dll")>
Public Shared Function FindWindow(ByVal strclassName As String, ByVal strWindowName As String) As Integer

End Function

FindWindowВызов API:


.... Публичный hndMDIWord как целое число ... Если Word_Previously_Running, то попробуйте _mdiWordApp = GetObject (, "Word.Application") Поймать как исключение _mdiWordApp = New Word.Application End Try TryИначе _mdiWordApp = New Word.Application End If hndMDIWord = FindWindow ("Opusapp", "") Если hndMDIWord <> 0, то SetParent (hndMDIWord, Me.Handle.ToInt32 ()) End If


IЯ ожидаю, что FindWindow вернет целое число, представляющее дескриптор окна текущего запущенного экземпляра Word, и затем этот результат будет присвоен переменной hndMDIWord.ndow возвращает ожидаемый результат, но оператор присваивания для переменной hndMDIWord не выполняется должным образом;hndMDIWord заканчивается значением ноль.Нет ошибок и не возникает исключений.

Любые предложения и / или идеи, безусловно, будут высоко оценены.

С уважением,

Крис Флитвуд

1 Ответ

0 голосов
/ 07 июня 2019

Мне кажется, проблема в том, что IntPtr несовместимо с Integer.

Вам необходимо объявить тип возвращаемого значения как IntPtr:

<DllImport("user32.dll")>
Public Shared Function FindWindow(ByVal strclassName As String, ByVal strWindowName As String) As IntPtr

End Function

Поскольку:

  • FindWindow имеет HWND-тип возврата
  • С MSDN дескрипторы маршалируются как IntPtr

Также есть pinvoke.net веб-сайт с примерами взаимодействия .net сбыло большинство WinAPI функций.

Также необходимо объявить hndMDIWord как IntPtr и использовать его соответствующим образом, а другие функции WinAPI должны быть объявлены для использования IntPtr и для обработчиков:

Public hndMDIWord As IntPtr 
. . . . 
If hndMDIWord <> IntPtr.Zero Then 
...