【问题标题】:Overrided CreateParams Doesn't Take Effect覆盖的 CreateParams 不生效
【发布时间】:2016-12-13 13:59:18
【问题描述】:

我像这样覆盖了一个表单(System.Windows.Forms.Form,我将其称为 Form0)的 CreateParams 属性

protected override CreateParams CreateParams
{
    get
    {
        CreateParams _CreateParams = base.CreateParams;
        _CreateParams.ExStyle |= (WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
        _CreateParams.Parent = IntPtr.Zero;
        return _CreateParams;
    }
}

这个窗口应该不能被激活(WS_EX_NOACTIVATE)并且在任务栏中没有显示图标(WS_EX_TOOLWINDOW)。

我用的时候效果很好

Application.Run(new Form0());

但是当我使用时它并没有像我预期的那样工作

Form0.Show()

我想知道使用Show()时为什么以及如何使它生效。

【问题讨论】:

  • 不确定这些问题中的任何一个如何回答这个问题。问题是,在哪里你打电话给Form0.Show()?您是否尝试在您的 main 方法中执行此操作?如果是这样,那么不,那是行不通的。
  • @CodyGray 我有另一个表单(我将其称为 Form1)放在前台,并且在 Form1 中有一个文本框,当该文本框获得焦点时我调用 Form0.Show()。
  • OnFocus() 中调用Form0.Show() 之后会发生什么?

标签: c# .net winapi


【解决方案1】:

您应该禁用窗口的WS_EX_APPWINDOW 样式。您无需添加WS_EX_TOOLWINDOWWS_EX_NOACTIVATE 默认处理它:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams _CreateParams = base.CreateParams;
        _CreateParams.ExStyle |= WS_EX_NOACTIVATE;
        _CreateParams.ExStyle &= (~WS_EX_APPWINDOW); //<----
        _CreateParams.Parent = IntPtr.Zero;
        return _CreateParams;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2015-03-04
    • 2013-09-14
    相关资源
    最近更新 更多