C # как определить, потерял ли Excel фокус

У меня есть надстройка Excel (написанная на C # и ExcelDNA) с формой, позволяющей пользователю вводить данные в элемент управления, унаследованный от текстового поля. Форма модальная. При входе в элемент управления появляется контекстное меню с вариантами выбора, основанными на вводе пользователя.

Если пользователь ввел данные и контекстное меню отображается, а затем пользователь делает другое приложение активным, контекстное меню охватывает это приложение.

Есть ли событие, которое я могу использовать вне приложения Excel, чтобы определить, что Excel потерял фокус?


person Lee Z    schedule 12.03.2014    source источник


Ответы (1)


Я придумал, как сделать так, чтобы контекстное меню отображалось, а не закрывали другие элементы. Моя проблема заключалась в том, что контекстное меню всегда было видимым во время ввода в текстовое поле, потому что я устанавливал для свойства AutoClose значение false в событии TextChanged текстового поля. Теперь я устанавливаю для свойства AutoClose значение false в событии TextChanged при повторном заполнении списка элементов. Это делается для любого нажатия клавиши, введенного в текстовое поле после ввода 3-го символа.

Затем я создал событие закрытия контекстного меню следующим образом:

    #region Instance Variables
    ContextMenuStrip menuStrip = new System.Windows.Forms.ContextMenuStrip();
    public event EventHandler EntryComplete;
    public event EventHandler EntryNotComplete;
    public event EventHandler EntryError;
    #endregion

    // Control Constructor
    public AutoCompleteTextBox()
    {
        InitializeComponent();

        menuStrip.PreviewKeyDown += menuStrip_PreviewKeyDown;
        this.Leave += AutoCompleteTextBox_Leave;

        // Use closing event so that we can determine when to close the menustrip.
        menuStrip.Closing += new ToolStripDropDownClosingEventHandler(menuStrip_Closing);
    }

    void menuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)
    {
        // only close the menu strip when an item is selected or the application loses focus
        if (e.CloseReason != ToolStripDropDownCloseReason.ItemClicked &&
            e.CloseReason != ToolStripDropDownCloseReason.AppFocusChange)
        {
            e.Cancel = true;
        }
    }

    private void AutoCompleteTextBox_TextChanged(object sender, EventArgs e)
    {
        .
        .
        .
        try
        {
            // get information on whether a ToolbarMenuItem has been selected
            MenuItem info = new MenuItem();
            MenuItemInfo selectedToolStripMenuInfo = info.SelectedItem(menuStrip);

            menuStrip.AutoClose = true;
            menuStrip.Visible = false;
            menuStrip.Items.Clear();

            if (selectedToolStripMenuInfo == null)
            {
                EntryNotComplete(sender, e);
            }

            if (base.Text.Length >= 3 && selectedToolStripMenuInfo == null)
            {
                .
                .
                .

                menuStrip.AutoClose = false;

                // foreach loop to add items into list
                foreach (SearchType item in lst)
                {
                    szMenuItem = ...;

                    ToolStripItem tsItem = new ToolStripMenuItem();
                    tsItem.Text = szMenuItem;
                    tsItem.Name = item.DealId;
                    tsItem.Click += tsItem_Click;
                    tsItem.Font = new Font("Courier New", 8.0F, FontStyle.Italic);
                    menuStrip.Items.Add(tsItem);
                }

                Point point = base.Location;
                point.Offset(2, base.Height + 2);
                point = base.GetPositionFromCharIndex(base.SelectionStart);
                point.Offset(2, base.Font.Height + 2);

                base.ContextMenuStrip = menuStrip;
                base.ContextMenuStrip.Show(base.PointToScreen(point));
                base.Focus();

                menuStrip.AutoClose = true;
            }
            else if (base.Text.Length >= 3 && selectedToolStripMenuInfo != null)
            {
                EntryComplete(sender, e);
            }
        }
        catch (Exception ex)
        {
            ErrorDescription = ex.Message;
            menuStrip.AutoClose = true;
            menuStrip.Visible = false;
            EntryError(sender, e);
        }
    }
person Lee Z    schedule 17.03.2014