Application.Exit нужно вызывать дважды - PullRequest
2 голосов
/ 24 января 2012

У меня есть метод Main, который создает цикл сообщений с именем SysTrayApp:

void Main()
{
    Application.Run(new SysTrayApp());
}  

Мой класс SysTrayApp добавляет ContextMenu к значку на панели задач, а затем запускает другой цикл сообщений под названием MouseHook. MouseHook - это класс, который определяет события мыши. (По модели это класс.)

class SysTrayApp : Form
{           
    public SysTrayApp()
    {
        // Does some GUI work    
        // Then starts another message loop
        Application.Run(new MouseHook());
    }
}

_

class MouseHook : Form
{           
    public MouseHook()
    {
        // Does some hooking stuff      
    }
}

В SysTrayApp, Application.Exit() вызывается, когда пользователь выбирает опцию Выход из контекстного меню. Проблема в том, что мне нужно дважды вызвать Exit (или добавить еще Application.Exit) для завершения приложения. Это ожидается, но Я чувствую, что поступаю неправильно. Вызов Application.Exit() дважды мне кажется неправильным, но я новичок в мире C #. Должны ли SysTrayApp и MouseHook быть объединены в один большой класс? MouseHook не похоже, что это должно быть отдельно от Windows.Form либо. Может быть MouseHook должен быть в новой теме? Есть предложения?

РЕДАКТИРОВАТЬ: Упс. MouseHook не было третьего Application.Run()

Решение

Полагаю, я обдумал это. Все еще изучаю C #, как я уже сказал. Но вот что работает:

Application.Run(new SysTrayApp()); в Main() - это все, что вам нужно. Чтобы начать MouseHook, просто сделайте MouseHook hook = new MouseHook(); в SysTrayApp.

Спасибо @JonSkeet за помощь в понимании этого. Вы машина!

1 Ответ

8 голосов
/ 24 января 2012

Вы вызываете Application.Run в конструкторе MouseHook , а затем, когда он возвращается, вы снова вызываете Application.Run (в конструкторе SysTrayApp) - затем вы вызываете это третий раз, когда конструктор SysTrayApp завершается. Если вы собираетесь запустить три разных цикла сообщений, вам следует ожидать, что вам придется выходить три раза (я поражен, что вам нужно только вызвать Application.Exit дважды).

Вы не должны вызывать Application.Run в либо ваших конструкторов - идея блокирования конструктора до тех пор, пока насос сообщений не завершит работу, неприлична, ИМО. Если вы действительно хотите несколько циклов сообщений, они должны быть в разных потоках - но я бы не советовал вам это делать. Вы должны быть в порядке просто , вызывая Application.Run в вашем Main методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...