伙计们,
请问有谁知道如何从一个不可见的应用程序中显示一个表单,并让它获得焦点(即出现在其他窗口的顶部)?我正在使用 C# .NET 3.5。
我怀疑我采取了“完全错误的方法”......我没有 Application.Run(new TheForm ())而不是我(new TheForm()).ShowModal() ... Form 基本上是一个模态对话,带有几个复选框;一个文本框,以及确定和取消按钮。用户勾选一个复选框并输入描述(或其他内容),然后按 OK,表单消失,进程从表单中读取用户输入,处理它,然后继续处理。
这是有效的,除非当表单显示时它没有获得焦点,而是出现在“主机”应用程序后面,直到您在任务栏(或其他任何内容)中单击它。这是一个最烦人的行为,我预测这会引起很多“支持电话”,而现有的 VB6 版本没有这个问题,所以我在可用性方面倒退了......而且用户不会接受(和他们也不应该)。
所以......我开始认为我需要重新考虑整个shebang......我应该预先显示表单,作为“普通应用程序”并将处理的剩余部分附加到OK-button-click事件。它应该可以工作,但这需要我没有的时间(我已经超过时间/预算)......所以首先我真的需要尝试让当前的方法发挥作用......即使是快速 -肮脏的方法。
那么请有人知道如何“强制”.NET 3.5 表单(通过公平的手段或家禽)来获得焦点吗?我在想“神奇”的 Windows API 调用(我知道
暮光之城:这似乎只是工作中的一个问题,我们在 Windows XP SP3 上使用 Visual Studio 2008 ......我只是未能在 Visual 上用家中的 SSCCE(见下文)重现该问题Vista Ulimate 上的 C# 2008 ......这很好用。嗯?怎么回事?
另外,我发誓昨天在工作时我运行 EXE 时显示了表单,但当我直接从 IDE(我刚刚忍受)F5'ed(或 Ctrl-F5'ed)时却没有......在家里无论哪种方式,表格都很好。完全令人困惑!
它可能相关也可能不相关,但是今天早上,当项目在调试模式下运行并“即时”编辑代码时,Visual Studio 崩溃并烧毁了……它卡住了,我认为这是一个无休止的错误循环消息。错误消息是关于“无法调试这个项目,因为它不是当前项目,或者什么......所以我只是用进程资源管理器将它关闭。它再次启动正常,甚至提出恢复“丢失的"文件,我接受了一个提议。
using System;
using System.Windows.Forms;
namespace ShowFormOnTop {
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
Form1 frm = new Form1();
frm.ShowDialog();
}
}
}
背景:我正在将现有的 VB6 实现移植到 .NET……它是一个名为MapInfo的“客户端”GIS 应用程序的“插件” 。现有客户端“工作无形”,我的指示是“使新版本尽可能接近旧版本”,效果很好(经过多年的修补);它只是用不受支持的语言编写的,所以我们需要移植它。
关于我:我基本上是 C# 和 .NET 的菜鸟,虽然我有一个擦屁股证书,但我已经做了 10 年的专业程序员;所以我有点“知道一些东西”。
任何见解都将受到欢迎......感谢大家花时间阅读本文。一致性不是(显然)我的强项。
干杯。基思。