各位好,
请问有人知道如何在一个本来不可见的应用程序中显示一个窗体,并让它获得焦点(即出现在其他窗口之上)吗?我使用的是C# .NET 3.5。
我怀疑我采取了“完全错误的方法”...我没有使用而是使用(new TheForm()).ShowModal()...这个窗体基本上是一个模态对话框,有几个复选框、一个文本框和OK和Cancel按钮。用户勾选复选框并输入描述(或其他内容)然后按下OK,窗体消失,进程从窗体读取用户输入,释放它并继续处理。
这个方法可以工作,除了当窗体显示时,它没有获得焦点,而是出现在“主机”应用程序的后面,直到你在任务栏(或其他位置)上单击它。这是一种非常烦人的行为,我预计将会引起很多“支持电话”,而且现有的VB6版本没有这个问题,所以我的可用性正在倒退……而且用户不会接受这样的情况(也不应该)。
因此……我开始思考整个方案……我应该像“普通应用程序”一样显示窗体,并将其余处理附加到OK按钮单击事件上。这应该可以工作。但这将需要时间,而我没有这个时间(我已经超过了时间/预算)……所以我真的需要尝试让当前方法起作用……即使是通过快速和肮脏的方法。
因此,请问有人知道如何“强制”一个.NET 3.5窗体(无论如何)获得焦点吗?我在想使用“神奇”的Windows API调用(我知道
奇怪的现象:这只出现在我的工作场所,在那里我使用的是Visual Studio 2008和Windows XP SP3……我刚刚在家里使用Visual C# 2008和Vista Ultimate失败复制这个问题……这可以正常工作。嗯?WTF?
还有一点,昨天在工作中,当我从EXE运行项目时,它显示了窗体,但是直接从IDE(我只好忍受)F5或Ctrl-F5运行时没有出现。在家里无论哪种方式都可以正常显示窗体。完全混乱!
可能相关,也可能不相关,但今天早上,在项目在调试模式下运行并编辑代码“即时”,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年的经验,所以我“有点懂一些东西”。
欢迎提供任何见解...谢谢大家花时间阅读到这里。显然,简洁并不是我的强项。
谢谢,Keith。