2015-08-17 4 views
-1

Мне нужна скрытая форма с отображаемой консолью в качестве пользовательского интерфейса (не спрашивайте, почему, мне не нужен другой способ). Все методы находятся в классе формы.Не могу скрыть форму. Окно появляется после завершения конструктора формы

Итак, я создал проект форм Windows с выходом консоли. Все работает отлично, но я не могу скрыть форму.

Форма Начало:

static void Main() { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 

А вот форма конструктора:

public Form1() { 
      InitializeComponent(); 
      this.Visible = false; 
      //here i try to find one other window by caption 
      //using FindWindow() WinAPI method 
      this.Text = "Generated window title"; 
      //find handle of this window: 
      int currentWindowHandle = (int)FindWindow(null, title); 
      //after this moment form is again visible 
     } 

Чтобы скрыть форму я использую этот код:

protected override void SetVisibleCore(bool value) { 
      if (!this.IsHandleCreated) { 
       value = false; 
       CreateHandle(); 
      } 
      base.SetVisibleCore(value); 
     } 

Форма начинается скрытая, но после того, как конструктор завершен , это снова видно.

Я попытался выяснить, в какой именно момент это происходит:

protected override void WndProc(ref Message m) { 
      Debug.WriteLine(m.Msg); 
      base.WndProc(ref m); 
     } 

Я получил это как выход:

//waited a while 
... 
24 x0018 = SHOWWINDOW 
528 x0210 = PARENTNOTIFY 
14 x000E = GETTEXTLENGTH 
13 x000D = GETTEXT 
70 x0046 = WINDOWPOSCHANGING 

До этого я уже получить много раз сообщений 13, 14, 70. Когда я получу последние 70 сообщений, появится окно base.WndProc(ref m);.

Искал объяснение сообщений:

ShowWindow = 0x0018

Сообщение WM_SHOWWINDOW посылается окну, когда окно собирается быть скрыты или показаны.

PARENTNOTIFY = 0x0210

сообщение WM_PARENTNOTIFY отправляется родителю дочернего окна, когда дочернее окно создается или уничтожается, или когда пользователь нажимает кнопку мыши, когда курсор находится над дочерним окном. Когда дочернее окно создается, система отправляет WM_PARENTNOTIFY непосредственно перед функцией CreateWindow или CreateWindowEx, которая создает окно. Когда дочернее окно уничтожается, система отправляет сообщение до того, как всякая обработка уничтожит окно.

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

ответ

-1

И после всего этого я нашел альтернативное решение.

Возможно, это бесполезно для сообщества. Но кто-то может встретить такую ​​же проблему, поэтому я опубликую ее. Если этот вопрос получит -5, я удалю его.

Вы можете просто:

this.WindowState = FormWindowState.Minimized; 
    this.ShowInTaskbar = false; 

Удивление, почему он не работает иногда:

this.Visible = false; 
+1

Вы нашли ответ на свой вопрос в то же время вы задали вопрос :) –

+0

Это будет по-прежнему показывать в Alt + Tab, к сожалению. –

0

Вы могли бы просто использовать this.Hide()

public Form1() { 
     InitializeComponent(); 
     this.Hide(); 
    } 
0

Попробуйте это может это поможет решить вашу проблему

Form1 frm = new Form1; 
frm.Hide(); 

Или

frm.visible = false; 
Смежные вопросы