Сообщество программистов Autodesk в СНГ

ADN Club => Inventor API => Тема начата: filat от 12-05-2021, 08:40:43

Название: Закрытие окна Измерений
Отправлено: filat от 12-05-2021, 08:40:43
В продолжение вопроса об окне Измерений, повторюсь:
Окно через winapi32 можно найти по имени, че нить вроде этого:

https://coderoad.ru/7942974/WinApi-FindWindow-%D0%BF%D0%BE-%D1%87%D0%B0%D1%81%D1%82%D0%B8-%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

Закрыть окно можно через:
https://coderoad.ru/18156002/%D0%92-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8-win32-C-%D1%87%D1%82%D0%BE%D0%B1%D1%8B-%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D1%82%D1%8C-%D0%BE%D0%BA%D0%BD%D0%BE-%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD-%D0%BB%D0%B8-%D1%8F-%D0%B2%D1%8B%D0%B7%D0%B2%D0%B0%D1%82%D1%8C-DestroyWindow
Миша, как всегда зрит в корень вопроса. Я и сам думал решить эту задачу с помощью инструментов winapi32, только вот не предполагал, что она окажется, мягко говоря, не простой.
Я раньше уже имел дело с winapi32 и вот привожу пример кода закрытия окна Contour Flange, который у меня точно работает:
Код - vb.net [Выбрать]
  1.     Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As Long, ByVal lParam As Long) As Long
  2.     Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$) As IntPtr
  3.  
  4.     Sub
  5.         Dim handl As Integer = FindWindowEx(0, 0, Nothing, "Contour Flange")
  6.         SendMessage(handl, &H10, Nothing, Nothing)
  7.     End Sub
А вот для окна Measure хэндл находиться, но сообщение о закрытии ни к чему не приводит. Еще пробовал применить функцию PostMessage - с тем же результатом.  :(
Очевидно, что внешне названные окна отличаются и, видимо, отличия не только в графике, но и в инструментах работы с ними.
Даже и не знаю, куда дальше копать!?  :o
Название: Re: Закрытие окна Измерений
Отправлено: mikazakov от 12-05-2021, 16:57:25
Ты знаешь, может окна и разные, уже лет 13 как работа с окнами может осуществляться не через winapi32, а через WPF. Я с WPF вообще не знаком
Можешь утилиту поюзать из вижуал студио может поможет
(https://i.postimg.cc/1gWsZqZS/image.png) (https://postimg.cc/1gWsZqZS)
Название: Re: Закрытие окна Измерений
Отправлено: filat от 12-05-2021, 18:39:53
Посмотрел и подзавис!  :-X
Там даже не одно окно, а несколько..., да еще и с жутким классом...
Не уверен, что найду нормальное решение этой задачи, но, как настоящий извращенец, я её решил, пока, через ж! То бишь вызовом команды "гашения видимых зависимостей" - она и окно измерений закрывает и сама быстро финализируется!  ;D 8) ;D
Название: Re: Закрытие окна Измерений
Отправлено: filat от 14-05-2021, 12:04:32
Оказывается, функция FindWindow по названию "Measure" выдает не тот хэндл - видимо он принадлежит одному из дочерних окон и, по этому, закрытие не происходит.
Однако Measure добавляется в коллекцию DockableWindows и там есть актуальный действительный хэндл окна и тогда можно выполнить закрытие:
Код - vb.net [Выбрать]
  1. Call SendMessage(m_inventorApplication.UserInterfaceManager.DockableWindows.Item("Measure").HWND, &H10, 0, 0)
Название: Re: Закрытие окна Измерений
Отправлено: mikazakov от 14-05-2021, 13:15:57
Однако Влад таки победил инвентор?
Название: Re: Закрытие окна Измерений
Отправлено: Александр Ривилис от 14-05-2021, 13:17:47
Однако Влад таки победил инвентор?
Я бы сказал не победил, а сломал... :)
Название: Re: Закрытие окна Измерений
Отправлено: filat от 14-05-2021, 13:22:25
Однако Влад таки победил инвентор?
Я еще не оставляю надежны, найти решение задачи средствами API, вот только недоумеваю  почему у DockableWindows отсутствует метод Close  :D