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应用程序的关注?
对于我来说,我在中间添加了下面这一行,它工作得很好。
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应用程序