Скрытая форма появляется в левом нижнем углу - PullRequest
2 голосов
/ 09 сентября 2011

Мое приложение Windows Forms запускает другое; последний должен оставаться скрытым, появляться и исчезать, когда пользователь нажимает клавишу F9.

Мне нужна скрытая форма для запуска в другом процессе, поэтому я использую Process.Start. Тем не менее, независимо от того, что я делаю, я не могу скрыть форму. Он всегда появляется в левом нижнем углу, и странно, он показывает только строку заголовка, из которой я могу увеличить его. Это нежелательно.

Я пытался настроить StartInfo с ShellExecute = false, CreateNoWindow = true, WindowStyle = ProcessWindowStyleHidden, вы называете это.

Я также попытался перейти к конструктору формы и установить для ShowInTaskbar значение false, но без сигары. Одна вещь, которая привлекла мое внимание, когда я попытался, это то, что свойство WindowState можно установить только на Normal, Minimized или Maximized, а не Hidden.

Я в тупике. Какие-либо предложения? (Помимо отказа от Windows Forms; это устаревший код)

Редактировать : (Очень важно) Я забыл упомянуть, что мое основное приложение полноэкранное и рабочий стол Windows заблокирован. То есть, когда машина загружается, моё основное приложение запускается вместо Explorer

Ответы [ 4 ]

1 голос
/ 09 сентября 2011

Форма должна иметь свойство «Видимый». Если вы установите значение «Ложь», я не уверен, что она поймает вашу клавишу F9.

Однако вы должны иметь возможность установить свойства «Влево» и «Вверх»значения за пределами экрана, а затем восстановить соответствующие значения при необходимости.

Что-то вроде

Form1.Top= 3000
Form1.Left = 3000

и

Form1.Top = _appropriateTop
Form1.Left = _appropriateLeft
1 голос
/ 09 сентября 2011

Скрытие 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();
        }
    }
0 голосов
/ 16 ноября 2011

Я решил это давно, но забыл опубликовать свое решение. Ключ должен был минимизировать созданную форму. В конструкторе в 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...
}
0 голосов
/ 09 сентября 2011

Вы просто пытаетесь добиться асинхронной обработки?Например, можно ли обрабатывать основную форму, пока что-то еще работает ?Если вы хотите обрабатывать другой набор кода / данных асинхронно, почему бы не настроить поток для выполнения этой задачи в фоновом режиме?например,

В C #,

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

    private void DoSomethingAsync()
    {
        // Do Something
    }

Это позволит обрабатывать ваш блок кода без блокировки основного потока.Вы можете выполнить эту же логику разными способами, в зависимости от ваших обстоятельств, таких как фоновый рабочий, пул потоков или одноразовые потоки.Все зависит от ваших требований.

...