7

当我们的应用程序在 Windows Vista 中以编程方式启动(通过 MSI 安装程序中的自定义操作或启动新实例时)时(也发生在 Windows 7 Beta 中),它不会出现在任务栏中并且没有焦点。Alt-tab 键将使其正确显示在任务栏中并留在那里。

这是什么原因造成的?我之前在其他一些应用程序中也看到过这种情况,但不知道为什么。Out 应用程序是 .NET WinForms 应用程序。从来没有在 XP 中看到过这种情况,只有 Vista 和 7

编辑:好吧,这似乎是唯一一次可重复发生的情况是当它由安装程序运行时,我相信它还会发生其他时间,但我可能只是疯了。发布代码有点复杂,因为我们处理各种命令行启动参数,它会在实际启动主应用程序之前启动一个登录表单等。

有没有人必须处理过这种情况并解决了这个问题?

4

9 回答 9

3

尝试检查您的主申请表“表单边框”属性。如果它是 ToolWindow(Fixed 或 Sizable),请尝试将其更改为 FixedDialog 例如。这解决了我的问题。

于 2012-12-05T12:58:49.803 回答
1

G.So 的回答让我找到了解决问题的方法,这是因为我的表单从启动时就相当大,但在加载无效时设置为无边界。

如果有人对我如何设法将开关保持在无边界状态并让它在任务栏中弹出而没有任何肮脏的黑客行为感兴趣..这里是..

在表单的“显示”事件上从表单中创建一个新事件,并将用于切换到无边框的代码行放在这里。问题解决了 :)

    private void Form1_Shown(object sender, EventArgs e)
    {
         this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    }

    and for the lazy ones ;) >>>>

    this.Shown += new EventHandler(Form1_Shown);

再次感谢 G.So 首先清除可能导致此问题的原因。

于 2013-05-03T22:28:54.320 回答
1

通常的原因是您的主应用程序窗口没有让 Windows 知道它是主应用程序窗口(而不是工具窗口或对话框)的窗口样式。因此,Windows 必须根据应用程序的启动方式等进行猜测。

如果您的窗口与其他不存在此问题的窗口的窗口样式,请使用 Spy++ 比较窗口样式(尤其是扩展样式)。你错过了WS_EX_APPWINDOW风格吗?是否有任何其他样式/扩展样式与其他顶级窗口不同?

于 2009-12-28T23:00:24.630 回答
1

我也纠结于这个问题,发现就像之前的评论者所说,表单的 Load() 事件中不能有任何改变 FormBorderStyle 属性的东西。将任何改变它的东西移动到 Shown() 事件。

于 2016-03-29T19:15:03.517 回答
0

从来没有在 XP 中看到过这种情况,只有 Vista 和 7

也许这是Vista中的一个错误......?

如果您调用 SetForegroundWindow()(或 .Net 中的等价物)会发生什么?

编辑

我的意思当然是“BringWindowToTop()”。

或者两者都做。

于 2009-03-18T18:21:28.373 回答
0

好吧,一种解决方案是使用这样的hack。这真的不是它的目的。

通常,窗口是否在任务栏中的决定取决于它使用的边框样式。我链接到的文章提供了更多细节。文章关于窗口是否拥有所有者的评论很可能与您的问题高度相关,因为当安装程序启动时,窗口可能会以某种方式获得不同的所有者。

那篇文章是用 VB 编写的,但它都基于 API 调用,因此它提供的信息与语言无关。

于 2009-03-18T18:49:55.310 回答
0

我们遇到了同样的问题,并通过将表单属性 showintaskbar 属性设置为 true 来修复它。

奇怪的是所有 Windows 操作系统的运行应用程序的方式都不相同!

于 2010-03-03T08:56:41.693 回答
0

我们在 Windows 8 中也遇到了同样的问题。有时表单正确接收焦点,但只有大约 30% 的时间。

我们尝试了不同的解决方案,但实际上可行的解决方案如下:

private void OnFormShown(object sender, EventArgs e)
{
    // Tell Windows that the Form is a main application window
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;

    // Even if true, enforce the fact that we will the application on the taskbar
    this.ShowInTaskbar = true;

    // Put the window to the front and than back
    this.BringToFront();
    this.TopMost = true;
    this.TopMost = false;

    // 'Steal' the focus.
    this.Activate();
}

此外,我们还确保在 Load 事件期间不设置表单的标题。

于 2013-07-11T07:47:22.867 回答
0

在我们的情况下,这可以追溯到在Load事件中更改表单的文本属性。

将其放入 a 后BeginInvoke,不再发生这种奇怪的行为。

希望这对其他人有帮助。

例子

private void Form_Load(object sender, EventArgs e)
{
    ...
    ...
    ...
    // this needs to be inside a BeginInvoke otherwise it messes with the taskbar visibility
    this.BeginInvoke(new Action(() =>
        {
            this.Text = "Something new";
        }));
    ...
    ...
    ...
}
于 2013-05-02T16:41:26.197 回答