Как определить разницу между внешним wm_close и внутренним вызовом form.close () - PullRequest
2 голосов
/ 03 августа 2011

Это приложение на C #, которое находится в трее в качестве уведомления и выполняет свои действия до тех пор, пока кто-то не щелкнет по нему правой кнопкой мыши и не выберет close (опция меню) или не получит wm_close из внешнего приложения или операционной системы, скажем, во время перезагрузки ,

protected override void WndProc(ref Message m)
{
   case  Win32.WmClose:
  //recvd message to shutdown
   Program.Log.InfoFormat("Shutdown received at {0}", DateTime.Now);
   CleanUp();
   this.Close(); //this is the main form
   break;

   //other case statements here
}

//somewhere else on menu exit of notify icon
 private void toolStripMenuItemExit_Click(object sender, EventArgs e)
 {
        Program.Log.InfoFormat("Manual EXIT at {0}", DateTime.Now);
        CleanUp();
        this.Close(); //this is the main form
 }

this.close () запускает другой WM_CLOSE, отправляющий приложение в штопор. Как правильно справиться с этой ситуацией? спасибо

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Обработка формы Closing событие. и всякий раз, когда вы хотите выйти, просто вызовите Close(); и заставьте любую другую операцию полагаться на закрытие внутри события закрытия вместо обработки в WndProc и toolStripMenuItemExit_Click, поэтому:

private void OnFormCloseing(object sender, FormClosingEventArgs e)
{
    string reason = string.Empty;
    switch (e.CloseReason)
    {
        case CloseReason.UserClosing:
            reason = "Manual EXIT";
            break;

        case CloseReason.WindowsShutDown:
            reason = "Shutdown received";
            break;
    }
    Program.Log.InfoFormat(reason + " at {0}", DateTime.Now);
    CleanUp();
}

private void toolStripMenuItemExit_Click(object sender, EventArgs e)
{
    this.Close(); //this is the main form
}

Больше членов CloseReason здесь .

0 голосов
/ 03 августа 2011

Удалите вызов CleanUp () как из toolStripMenuItemExit_Click, так и из WndProc.

Добавьте обработчик события FormClosing () в форме главного окна (если он у вас есть).Опять же, при условии, что у вас есть главное окно формы, почему у вас вообще есть WndProc?

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

...