C# 防止Revit窗口打开

C# 防止Revit窗口打开,c#,revit,revit-api,C#,Revit,Revit Api,我正在尝试拦截Revit并阻止窗口打开。具体地说,我尝试将注释记号应用于对象,然后让用户创建注释记号标记,但不管我如何做,它都允许用户放置注释记号,但随后立即给他们提供选择注释记号的对话框,但我不希望出现该对话框,因为我已经知道应该选择什么。然而,我所能想到的每一种方法都不能在用户获得对话框之前中断应用注释记号的过程。是否可以监视窗口的显示,然后通过Windows API将其关闭?或者更好地截取将要显示的内容并阻止其显示?您可以始终使用以下选项删除警告:failuresAccessor.Dele

我正在尝试拦截Revit并阻止窗口打开。具体地说,我尝试将注释记号应用于对象,然后让用户创建注释记号标记,但不管我如何做,它都允许用户放置注释记号,但随后立即给他们提供选择注释记号的对话框,但我不希望出现该对话框,因为我已经知道应该选择什么。然而,我所能想到的每一种方法都不能在用户获得对话框之前中断应用注释记号的过程。是否可以监视窗口的显示,然后通过Windows API将其关闭?或者更好地截取将要显示的内容并阻止其显示?

您可以始终使用以下选项删除警告: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;
    }
}
公共类地板处理器:IFailuresPreprocessor
{
故障处理结果
IFailuresPreprocessor.Preprocessor失败(
故障访问器故障访问器)
{
IList fmas
=failuresAccessor.GetFailureMessages();
如果(fmas.Count==0)
{
返回故障处理结果。继续;
}
//我们已经知道交易名称。
如果(fmas.Count!=0)
{
foreach(fmas中的FailureMessageAccessor fma)
{
//DeleteWarning模拟单击“确定”按钮。
故障访问器删除警告(fma);
}
返回故障处理结果
.ProceedWithCommit;
}
返回故障处理结果。继续;
}
}

我希望它会有所帮助

尝试以下操作,它搜索窗口名、按钮名,然后单击此按钮:

    [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;
    }
您应该将弹出按钮(窗口名)和按钮名设置为单击

将其调用为等待窗口弹出的计时器事件

  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("","")
    }

试试看,让我知道。

好吧,既然有新的评论,我会把它作为正式的回答。我想到的最好的方法是,您可以在对话框上调用OverrideResult(),即使您不能取消它。它闪烁的对话框并不理想,但它比它更好。。。如果有人有更好的方法,我很想听到:)

p.s.我确实尝试过处理对话框显示事件,并且我可以在对话框即将显示时收到通知,但事件无法取消…很抱歉,在发布最后一条评论后,我对其进行了更多的研究,您可以在对话框上调用OverrideResult(),即使您无法取消它。它闪烁的对话框并不理想,但它比它更好。。。如果有人有更好的方法,我很乐意听到:)是的,但这不是一个失败处理事件。它只是弹出了注释记号选择对话框供用户选择,这是我想要抑制的…哦,你应该取消什么对话框,我在这里看到了:但我还没有测试这个,但可能它会帮助你是的,根据我对原始问题的最后评论,这就是我最后要做的。它仍然会闪现一秒钟的对话,这是我希望避免的,但它比以前好多了,而且很有效。3岁的问题。。。但是,这会再次等待对话框打开,然后模拟一次单击,与我最终使用的“OverrideResult”选项相比,它的直接性和可靠性要低一步,并且仍然会使对话框闪烁。我所希望的是一种避免对话出现的方法。