WPF - 调用 System.Windows.Forms.SendKeys.Send("{ESC}") 时出现问题
WPF - problem when invoking System.Windows.Forms.SendKeys.Send("{ESC}")
在我的 Autodesk Revit 插件中,我在 Revit 上打开了一个无模式 WPF window。在 window 上,我有一个复选框决定 Revit 应用程序中的选择模式。每次在复选框上切换模式时,我需要将“ESC”键发送到 Revit,以便它取消当前模式并进入其他模式(发送 ESC 时 Revit 抛出异常,我从 catch 语句调用其他模式递归地)"。
这是当前代码:
<CheckBox IsChecked="{Binding Path=IsMultiselection}" Checked="multiselection_chk_Checked" Unchecked="multiselection_chk_UnChecked">
private void multiselection_chk_Checked(object sender, RoutedEventArgs e)
{
MultiselectChanged = true;
ActivateRevitWindow();
System.Windows.Forms.SendKeys.Send("{ESC}");
}
private void multiselection_chk_UnChecked(object sender, RoutedEventArgs e)
{
MultiselectChanged = true;
ActivateRevitWindow();
System.Windows.Forms.SendKeys.Send("{ESC}");
}
public class ViewModel : INotifyPropertyChanged
{
private bool _isMultiselection;
public bool IsMultiselection
{
get => _isMultiselection;
set
{
_isMultiselection = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我目前面临的问题是,尽管在 Revit 中正确切换了选择模式,但我的 window 的 UI 没有更新 - 复选框经常未选中。
我注意到,如果我在 System.Windows.Forms.SendKeys.Send("{ESC}");
之后放置任何代码,在我调试时将无法访问它,如果我注释掉这一行,UI 工作正常,但选择模式不会在 Revit 中切换.
关于如何修复这个已经很糟糕的解决方案有什么想法吗?
最终我通过将 System.Windows.Forms.SendKeys.Send("{ESC}");
替换为以下代码解决了这个问题:
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, IntPtr lParam);
const int WM_KEYDOWN = 0x0100;
public void PressEsc()
{
PostMessage(RevitWindowHandle, WM_KEYDOWN, System.Windows.Forms.Keys.Escape, IntPtr.Zero);
}
灵感来自this答案。
在我的 Autodesk Revit 插件中,我在 Revit 上打开了一个无模式 WPF window。在 window 上,我有一个复选框决定 Revit 应用程序中的选择模式。每次在复选框上切换模式时,我需要将“ESC”键发送到 Revit,以便它取消当前模式并进入其他模式(发送 ESC 时 Revit 抛出异常,我从 catch 语句调用其他模式递归地)"。
这是当前代码:
<CheckBox IsChecked="{Binding Path=IsMultiselection}" Checked="multiselection_chk_Checked" Unchecked="multiselection_chk_UnChecked">
private void multiselection_chk_Checked(object sender, RoutedEventArgs e)
{
MultiselectChanged = true;
ActivateRevitWindow();
System.Windows.Forms.SendKeys.Send("{ESC}");
}
private void multiselection_chk_UnChecked(object sender, RoutedEventArgs e)
{
MultiselectChanged = true;
ActivateRevitWindow();
System.Windows.Forms.SendKeys.Send("{ESC}");
}
public class ViewModel : INotifyPropertyChanged
{
private bool _isMultiselection;
public bool IsMultiselection
{
get => _isMultiselection;
set
{
_isMultiselection = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我目前面临的问题是,尽管在 Revit 中正确切换了选择模式,但我的 window 的 UI 没有更新 - 复选框经常未选中。
我注意到,如果我在 System.Windows.Forms.SendKeys.Send("{ESC}");
之后放置任何代码,在我调试时将无法访问它,如果我注释掉这一行,UI 工作正常,但选择模式不会在 Revit 中切换.
关于如何修复这个已经很糟糕的解决方案有什么想法吗?
最终我通过将 System.Windows.Forms.SendKeys.Send("{ESC}");
替换为以下代码解决了这个问题:
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, IntPtr lParam);
const int WM_KEYDOWN = 0x0100;
public void PressEsc()
{
PostMessage(RevitWindowHandle, WM_KEYDOWN, System.Windows.Forms.Keys.Escape, IntPtr.Zero);
}
灵感来自this答案。