【问题标题】:Hidden form appears in bottom left corner隐藏的表格出现在左下角
【发布时间】:2011-09-08 20:42:35
【问题描述】:

我的 Windows 窗体应用程序启动另一个;后者旨在保持隐藏状态,并在用户按下 F9 键时出现和消失。

我需要隐藏表单在另一个进程中运行,所以我使用Process.Start。但是,无论我做什么,我都无法让表单开始隐藏。它总是出现在左下角,奇怪的是,它只显示标题栏,我可以从中最大化它。这是不希望的。

我尝试用ShellExecute = falseCreateNoWindow = trueWindowStyle = ProcessWindowStyleHidden 调整StartInfo,你说的。

我还尝试去表单的设计器并将 ShowInTaskbar 设置为 false,但没有雪茄。尝试时引起我注意的一件事是 WindowState 属性只能设置为正常、最小化或最大化,而不是隐藏。

我被难住了。有什么建议么? (除了放弃 Windows 窗体;这是遗留代码)

编辑:(非常重要)我忘了说我的主应用是全屏的,并且 Windows 桌面是锁定的。也就是说,当机器启动时,我的主应用程序启动而不是资源管理器

【问题讨论】:

  • 如果隐藏表单是您自己的代码库的一部分(一项任务,但必须异步运行的单独进程),我们可以帮助您编写异步代码,这样您就不需要单独的进程.另外请注意,WinForms 现在已经过时了,但无论如何它绝对不是遗产。这是绝对要求这是它自己的 AppDomain 中的一个单独进程吗?
  • 是的,先生,它绝对是一个单独的应用程序。不了解 AppDomains,也许我应该使用它而不是 Process.Start()?怎么样?
  • 这只能在您启动的应用程序内完成,而不是从您的外壳替换中完成。目前尚不清楚这是否适合您的问题。

标签: .net winforms hide


【解决方案1】:

Form 应该有一个名为“Visible”的属性如果你将它设置为 False,我不确定它是否会捕捉到你的 F9 键。

但是,您应该能够将 Left 和 Top 属性设置为屏幕边界之外的值,然后在需要时恢复适当的值。

类似

Form1.Top= 3000
Form1.Left = 3000

Form1.Top = _appropriateTop
Form1.Left = _appropriateLeft

【讨论】:

  • 是的,我知道那个属性。我尝试在InitializeComponent() 中将其设置为false,但CLR 在Process.Start 调用的某处将其更改为True...我可以尽快将其设置为false,但话又说回来,表单将可见一会……万不得已我会考虑改变位置,一定有更优雅的解决方案
  • 另一种方法是将 Opacity 属性设置为 0。
【解决方案2】:

在启动时隐藏 winform。这对我有用。

    public Form1()
    {
        InitializeComponent();
        var t = new Thread(new ThreadStart(HideThisForm));
        t.Start();
    }

    delegate void FormCallback();
    void HideThisForm()
    {
        if (this.InvokeRequired)
        {
            var d = new FormCallback(HideThisForm);
            this.Invoke(d);
        }
        else
        {
            this.Hide();
        }
    }

【讨论】:

  • 不能这样做,它们必须保持完全独立的进程。也许我可以以其他方式启动第二个应用程序,而不是使用“Process.Start”...?
  • 我的错,我在考虑单独的线程,而不是进程。试试这个新的例子。
【解决方案3】:

你只是想实现异步处理吗?例如,让您的主表单处理而其他东西工作?如果你想异步处理另一组代码/数据,为什么不设置一个线程在后台为你完成任务呢?例如

在 C# 中,

    public Form1()
    {
        InitializeComponent();
        new Thread(() => DoSomethingAsync());
    }

    private void DoSomethingAsync()
    {
        // Do Something
    }

这将允许您的代码块在不锁定主线程的情况下进行处理。您可以通过多种方式完成相同的逻辑,具体取决于您的环境——例如后台工作线程、线程池或一次性线程。这完全取决于您的要求。

【讨论】:

    【解决方案4】:

    我很久以前就解决了这个问题,但忘记发布我的解决方案。关键是要最小化创建的表单。在设计器中,在InitializeComponent,我添加了:

     TopMost = true;
     TopLevel = true;
     WindowState = System.Windows.Forms.FormWindowState.Minimized;
    

    而且,为了更好地衡量,我在致电InitializeComponent 后再次这样做(几乎无法察觉的闪烁,但它有效):

    public void Init( bool pQueryAndRetrieveForm, ref bool pIsOpen ) {
           InitializeComponent();
           WindowState = FormWindowState.Minimized;
           //More initialization code...
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      相关资源
      最近更新 更多