各位朋友:
有没有人知道如何从其他看不见的应用程序中显示窗体,并使其获得焦点(即显示在其他窗口的顶部)?我在C# .NET 3.5中工作。
我怀疑我采取了“完全错误的方法”...I do do notApplication.Run( TheForm ())而不是I (new TheForm()).ShowModal()...该表单基本上是一个模式对话框,包含几个复选框、一个文本框以及OK和Cancel按钮。用户勾选一个复选框并键入描述(或其他内容),然后按OK,表单消失,流程从表单中读取用户输入,对其进行处理,然后继续处理。
这是有效的,除了当窗体显示它没有获得焦点,相反,它出现在“主机”应用程序后面,直到您在任务栏(或其他任何地方)中单击它。这是一个最烦人的行为,我预测这将导致许多“支持电话”,而现有的VB6版本没有这个问题,所以我在可用性上倒退了……用户不会接受这一点(也不应该接受)。
所以..。我开始觉得我需要重新考虑整个事情...我应该在前面显示表单,作为“普通应用程序”,并将处理的剩余部分附加到OK-button-click事件。它应该可以工作,但这将花费我没有的时间(我已经超出了时间/预算)……所以首先,我真的需要试着让目前的方法工作…即使是通过快速和肮脏的方法。
所以,有没有人知道如何“强迫”一个.NET 3.5表单(不管怎样)来获得焦点?我在想“神奇的”windows API调用(我知道
这似乎只是一个工作上的问题,我们正在Windows XP SP3上使用Visual Studio2008...我在家中的Vista Ulimate上的Visual C# 2008上的SSCCE (见下文)上未能重现这个问题。这可以很好地工作。哈?见鬼?
另外,我发誓昨天在工作中我运行EXE时显示的是表单,而不是直接从IDE (我刚刚忍受)按F5(或Ctrl-F5)时显示的表单……在国内,无论哪种方式,表单都显示得很好。完全令人困惑!
这可能是相关的,也可能是无关的,但今天早上,当项目在调试模式下运行并“在运行中”编辑代码时,Visual Studio崩溃了。它卡住了,我认为这是一个无休止的错误消息循环。这个错误信息是关于“无法调试这个项目,因为它不是当前的项目,或者别的什么……所以我就用process explorer把它关掉了。它重新启动得很好,甚至提出要找回”丢失的“文件,我接受了这个提议。
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的“客户端”地理信息系统应用程序的“插件”。现有的客户端“看不见地工作”,我的指示是“让新版本尽可能接近旧版本”,它工作得足够好(经过多年的修补);它只是用一种不受支持的语言编写的,所以我们需要移植它。
关于我:我基本上是C#和.NET的新手,虽然我有擦底证书,但我已经做了10年的专业程序员;所以我有点“了解一些东西”。
任何见解都将是非常受欢迎的。感谢大家抽出时间来阅读这篇文章。敏锐(显然)不是我的强项。
干杯。基思。
发布于 2009-06-12 15:14:56
简单地说
yourForm.TopMost = true;
发布于 2012-04-19 02:45:35
Form.Activate()
在我的案例中工作过。
发布于 2009-06-12 15:16:27
Form.ShowDialog()有一个重载,它接受一个IWin32Window对象。该IWin32Window被视为窗体的父窗口。
如果您将父窗口作为System.Windows.Forms.Form,则直接传递它即可。如果不是,则获取HWND (可能通过P/调用FindWindow()),并创建一个仅返回HWND (More details)的虚拟IWin32Window实现。
https://stackoverflow.com/questions/987053
复制相似问题