Предотвратить открытие окна 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;
}
}
Надеюсь, это поможет