首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C#中实现窗体的前端显示

如何在C#中实现窗体的前端显示
EN

Stack Overflow用户
提问于 2009-06-12 14:49:47
回答 11查看 89.8K关注 0票数 25

各位朋友:

有没有人知道如何从其他看不见的应用程序中显示窗体,并使其获得焦点(即显示在其他窗口的顶部)?我在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把它关掉了。它重新启动得很好,甚至提出要找回”丢失的“文件,我接受了这个提议。

代码语言:javascript
复制
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年的专业程序员;所以我有点“了解一些东西”。

任何见解都将是非常受欢迎的。感谢大家抽出时间来阅读这篇文章。敏锐(显然)不是我的强项。

干杯。基思。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-06-12 15:14:56

简单地说

代码语言:javascript
复制
yourForm.TopMost = true;
票数 57
EN

Stack Overflow用户

发布于 2012-04-19 02:45:35

Form.Activate()在我的案例中工作过。

票数 6
EN

Stack Overflow用户

发布于 2009-06-12 15:16:27

Form.ShowDialog()有一个重载,它接受一个IWin32Window对象。该IWin32Window被视为窗体的父窗口。

如果您将父窗口作为System.Windows.Forms.Form,则直接传递它即可。如果不是,则获取HWND (可能通过P/调用FindWindow()),并创建一个仅返回HWND (More details)的虚拟IWin32Window实现。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/987053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档