VSTO Excel插件:当从模态窗口窗体调用Excel输入框时,焦点转到Visual Studio

本文关键字:Excel 焦点 Studio Visual 输入 调用 插件 模态 窗体 窗口 VSTO | 更新日期: 2023-09-27 18:15:20

我在Excel AddIn应用程序中有一个windows窗体。我使用ShowDialog()将表单显示为模态窗口。我需要在我的应用程序中指定一个范围地址。我添加了一个按钮,它叫application。inputbox。按钮单击事件包含以下代码

       private void button1_Click(object sender, EventArgs e)
    {
        Excel.Range myRng;
        Excel.Application app = Globals.ThisAddIn.Application;
        myRng = app.InputBox("Prompt", "Title", Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing,   8);
        label1.Text = myRng.Address.ToString();
        this.Focus();
    }

很好。但是,当输入框处于活动状态时,我需要隐藏窗口窗体。所以我稍微修改了代码

       private void button1_Click(object sender, EventArgs e)
    {
        Excel.Range myRng;
        Excel.Application app = Globals.ThisAddIn.Application;
        this.Visible = false;
        myRng = app.InputBox("Prompt", "Title", Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing,   8);
        label1.Text = myRng.Address.ToString();
        this.Visible = true;
        this.Focus();
    }

不幸的是,这引起了一个问题。当我单击该按钮时,焦点移动到Visual Studio。我做错了什么?如何在输入框打开的那一刻保留对Excel应用程序的关注?

VSTO Excel插件:当从模态窗口窗体调用Excel输入框时,焦点转到Visual Studio

对于我来说,我在中间添加了下面这一行,它工作得很好。

this.Visible = false;
this.BrintToFront();

我终于找到了解决办法。我更改了表单类中的代码,如下所示

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    private void button1_Click(object sender, EventArgs e)
    {
        Excel.Range myRng;
        Excel.Application app = Globals.ThisAddIn.Application;
        string fileName;
        fileName = app.ActiveWorkbook.Name;
        Process[] processes = Process.GetProcessesByName("excel");
        foreach (Process p in processes)
        {
            if (p.MainWindowTitle.Contains(fileName.Substring(fileName.LastIndexOf("/") + 1)))
            {
                SetForegroundWindow(p.MainWindowHandle);
            }
        }
        this.Visible = false;
        try
        {
            myRng = app.InputBox("Prompt", "Title", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 8);
        }
        catch
        {
            myRng = null;
        }
        if (myRng != null)
        {
            label1.Text = myRng.Address.ToString();
        }
        this.Visible = true;
        this.Activate();
    }

现在它按要求工作了。但是,我仍然想知道为什么会出现这个问题,是否有更简单的解决方案。如果你有什么想法,请告诉我。

注:这个链接很有用:设置焦点在Excel应用程序