【问题标题】:WPF - problem when invoking System.Windows.Forms.SendKeys.Send("{ESC}")WPF - 调用 System.Windows.Forms.SendKeys.Send("{ESC}") 时出现问题
【发布时间】:2023-03-17 17:37:01
【问题描述】:

在我的 Autodesk Revit 插件中,我在 Revit 顶部打开了一个非模式 WPF 窗口。在该窗口上,我有一个复选框,用于决定 Revit 应用程序中的选择模式。每次在复选框上切换模式时,我都需要向 Revit 发送“ESC”键,以便它取消当前模式并进入其他模式(发送 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 中正确切换了选择模式,但我的窗口 UI 没有更新 - 复选框一直处于未选中状态。 我注意到,如果我在 System.Windows.Forms.SendKeys.Send("{ESC}"); 之后添加任何代码,如果我注释掉这一行,则在调试时将无法到达,UI 工作正常,但选择模式不会在 Revit 中切换。

关于如何解决这个已经很奇怪的解决方案的任何想法?

【问题讨论】:

    标签: .net wpf xaml binding revit-api


    【解决方案1】:

    最终我通过用以下代码替换 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的回答。

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 1970-01-01
      • 2012-08-19
      • 2011-02-16
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      相关资源
      最近更新 更多