В общем - было интересно поиграться с этим делом. Немного погуглив и найдя некоторые примеры собрал такую солянку:
Извините, вам запрещён просмотр содержимого спойлеров.
Пример использования:
[Regeneration(RegenerationOption.Manual)]
[Transaction(TransactionMode.Manual)]
public class Main : IExternalCommand
{
[DllImport("User32.dll")]
public static extern Int32 FindWindow(String lpClassName, String lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
var selection = commandData.Application.ActiveUIDocument.Selection;
IList<Reference> selected = null;
using (new SelectionEnterHook(SelectionEnterHook.AcceptKeyVariant.Enter))
{
selected = selection.PickObjects(ObjectType.Element);
}
if (selected != null)
TaskDialog.Show("HookTest", "User select: " + selected.Count + " elements");
return Result.Succeeded;
}
catch (Exception exception)
{
System.Windows.MessageBox.Show(exception.Message);
return Result.Failed;
}
}
}
Но заставить нормально это работать я так и не смог. Один раз срабатывает - следующие 10 фаталит Ревит. В строке 159 солянки идет поиск кнопки
IntPtr hwndChild = FindChildWindow((IntPtr)h, "Button", "Готово");
Однако он не всегда срабатывает. Когда я отлаживал код и заходил в рекурсивный метод FindChildWindow (немного покрутив его) кнопка находилась. Без отладки ничего не находилось. Есть конечно предположение, что еще и Add-in manager чудачил
В общем резюмирую - забейте на эту идею. И как сказал мой коллега "Пользователи все-равно привыкли, что в Ревите это работает всегда так! А твоя команда будет наводить смуту" ))