Подтвердить выбор нескольких объектов нажатием Enter

Автор Тема: Подтвердить выбор нескольких объектов нажатием Enter  (Прочитано 2759 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
При использовании метода Selection.PickObjects пользователь подтверждает выбор левым кликом мышки по кнопке "Готово" в левом верхнем углу экрана.

Можно ли  дать пользователю возможность подтвердить свой выбор нажатием клавиши Enter?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Стандартными средствами Revit API этого сделать невозможно

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Спасибо. Очень жаль

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Спасибо. Очень жаль
Но если очень хочется, то можно конечно. Только, как заметил Александр, уже не стандартными средствами Revit API, а средствами Windows API. Но придется повозиться конечно.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо. Очень жаль
Но если очень хочется, то можно конечно. Только, как заметил Александр, уже не стандартными средствами Revit API, а средствами Windows API. Но придется повозиться конечно.
Ага. Хуки еще никто не отменял, только нужно будет найти эту кнопочку и послать ей WM_LBUTTONDOWN.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Виктор Чекалин 01-11-2017, 12:40:47

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В общем - было интересно поиграться с этим делом. Немного погуглив и найдя некоторые примеры собрал такую солянку:
Извините, вам запрещён просмотр содержимого спойлеров.

Пример использования:
Код - C# [Выбрать]
  1. [Regeneration(RegenerationOption.Manual)]
  2. [Transaction(TransactionMode.Manual)]
  3. public class Main : IExternalCommand
  4. {
  5.     [DllImport("User32.dll")]
  6.     public static extern Int32 FindWindow(String lpClassName, String lpWindowName);
  7.     [DllImport("user32.dll", SetLastError = true)]
  8.     public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
  9.     public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  10.     {
  11.         try
  12.         {
  13.             var selection = commandData.Application.ActiveUIDocument.Selection;
  14.  
  15.             IList<Reference> selected = null;
  16.             using (new SelectionEnterHook(SelectionEnterHook.AcceptKeyVariant.Enter))
  17.             {
  18.                 selected = selection.PickObjects(ObjectType.Element);
  19.             }
  20.             if (selected != null)
  21.                 TaskDialog.Show("HookTest", "User select: " + selected.Count + " elements");
  22.  
  23.             return Result.Succeeded;
  24.         }
  25.         catch (Exception exception)
  26.         {
  27.             System.Windows.MessageBox.Show(exception.Message);
  28.             return Result.Failed;
  29.         }
  30.  
  31.     }
  32. }

Но заставить нормально это работать я так и не смог. Один раз срабатывает - следующие 10 фаталит Ревит. В строке 159 солянки идет поиск кнопки
Код - C# [Выбрать]
  1. IntPtr hwndChild = FindChildWindow((IntPtr)h, "Button", "Готово");
Однако он не всегда срабатывает. Когда я отлаживал код и заходил в рекурсивный метод FindChildWindow (немного покрутив его) кнопка находилась. Без отладки ничего не находилось. Есть конечно предположение, что еще и Add-in manager чудачил

В общем резюмирую - забейте на эту идею. И как сказал мой коллега "Пользователи все-равно привыкли, что в Ревите это работает всегда так! А твоя команда будет наводить смуту" ))