Предотвратить открытие окна Revit

Я пытаюсь перехватить Revit и не открывать окно. В частности, я пытаюсь применить ключевую заметку к объекту, а затем позволить пользователю создать тег ключевой заметки, однако любой способ, которым я это делаю, позволяет им разместить ключевую заметку, но затем сразу же дает им диалог для выбора ключевой заметки, но я не не хочу, чтобы этот диалог появлялся, потому что я уже знаю, каким должен быть выбор. Однако все, что я могу придумать, не может прервать процесс, чтобы применить ключевую заметку до того, как пользователь получит диалог. Возможно ли отслеживать появление окна, а затем закрывать его через Windows API? или даже лучше перехватить, когда он будет показан, и остановить его показ?

3 ответа

Решение

Хорошо, так как был новый комментарий, я сделаю это официальным ответом. Лучшее, что я придумал, это то, что вы можете вызвать OverrideResult() в диалоговом окне, даже если вы не можете отменить его. Это все еще показывает диалог, который не идеален, но он лучше, чем был... Если у кого-то есть способ получше, я бы хотел это услышать:)

Попробуйте следующее: он ищет имя окна, имя кнопки, а затем нажимает эту кнопку:

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

    private const uint BM_CLICK = 0x00F5;


    public static bool clickButton (string popUpTitle, string ButtonName)
    {
        // Get the handle of the window
        IntPtr windowHandle = FindWindow((string)null, popUpTitle);
        if (windowHandle.ToInt32() == 0)
        {
            return false;
        }

        // Get button handle
        IntPtr buttonHandle = FindWindowEx(windowHandle, IntPtr.Zero, (string)null, ButtonName);
        if (buttonHandle.ToInt32() == 0) 
        {
            return false;
        }
        // Send click to the button
        SendMessage(buttonHandle, BM_CLICK, 0, 0);
        return true;
    }

Вы должны установить popUpTitle (имя окна) и ButtonName для щелчка.

Вызовите это в событие таймера, которое ожидает всплывающего окна.

  Timer timer = new Timer();
                timer.Start();
                timer.Tick += new EventHandler(timer_Tick);
  //when done call timer.Stop();

  private void timer_Tick(object sender, EventArgs e)
    {
       //set your code to clickButton("","")
    }

Попробуйте и дайте мне знать.

Вы всегда можете удалить предупреждения с помощью:failuresAccessor.DeleteWarning(fma);

это то, что я использую для своего кода

    public class FloorPreProcessor : IFailuresPreprocessor
{
    FailureProcessingResult
      IFailuresPreprocessor.PreprocessFailures(
        FailuresAccessor failuresAccessor)
    {

        IList<FailureMessageAccessor> fmas
          = failuresAccessor.GetFailureMessages();

        if (fmas.Count == 0)
        {
            return FailureProcessingResult.Continue;
        }

        // We already know the transaction name.

        if (fmas.Count != 0)
        {
            foreach (FailureMessageAccessor fma in fmas)
            {
                // DeleteWarning mimics clicking 'Ok' button.
                failuresAccessor.DeleteWarning(fma);
            }

            return FailureProcessingResult
              .ProceedWithCommit;
        }
        return FailureProcessingResult.Continue;
    }
}

Надеюсь, это поможет

Другие вопросы по тегам