2014-10-08 1 views
1

시스템 트레이 응용 프로그램으로 실행되는 무형 응용 프로그램이 있습니다. 임 씨는 컴퓨터가 닫히거나 응용 프로그램이 닫힐 때 코드를 실행해야하는 번거 로움이 있습니다.프로그램 닫기 및 pc 종료시 실행할 코드

이 내가 무엇을 가지고 지금까지

class sysTrayIcon 
{ 
    public sysTrayIcon() 
    { 
     AppDomain.CurrentDomain.ProcessExit += new EventHandler(exitCode); 
     SystemEvents.SessionEnding += new SessionEndingEventHandler(exitCode); 
    } 

    public void exitCode(object sender, EventArgs e) 
    {    
     contactCman appClosing = new contactCman(); 
     bool didWeSuceed = appClosing.stampUserOut();    
     if (didWeSuceed == false) 
     { 
      MessageBox.Show("Stamp out function run returned fail!!");     
     } 
     else 
     { 
      MessageBox.Show("Stamp out function run returned success"); 
     } 
    } 
} 

class contactCman 
{ 
    public Dictionary<string, string> getUrlResponse(string toDo) 
    { 
     var url = mainSiteUrl + "/" + apiFileName + "?" + "userid=" + userid + "&pw=" + pw + "&toDo=" + toDo; 
     HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     WebHeaderCollection header = response.Headers; 
     var encoding = ASCIIEncoding.ASCII; 
     string responseText; 
     using (var reader = new System.IO.StreamReader(response.GetResponseStream(), encoding)) 
     { 
      responseText = reader.ReadToEnd(); 
     } 
     // key1=value1;key2=value2;key3=value3; 
     var responseData = responseText.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) 
     .Select(part => part.Split('=')) 
     .ToDictionary(split => split[0], split => split[1]); 
     return responseData; 
    }  

    public Dictionary<string, string> checkLastStamp() 
    { 
     string toDo = "getLastStamp"; 
     Dictionary<string, string> urlResponse = getUrlResponse(toDo); 
     return urlResponse; 
    } 

    public bool stampUserOut() 
    { 
     Dictionary<string, string> usersLastStamp = checkLastStamp(); 
     string valueOfKey; 
     if (usersLastStamp.TryGetValue("checkInOut", out valueOfKey) && (valueOfKey == "in")) 
     { 
      string toDo = "stampUserOut"; 
      Dictionary<string, string> urlResponse = getUrlResponse(toDo); 
      if (urlResponse.TryGetValue("Message", out valueOfKey) && (valueOfKey == "Success!")) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return false; 
     }    
    } 
} 

내 문제입니다 비주얼 스튜디오 내부 디버거를 통해 실행할 때 의도 한대로 (만하지만 가까운 프로그램 테스트) 작품 위의 코드. 내가 밖에 실행하면 메시지 상자가 나타나지 않습니다.

+0

안녕하세요, 'SystemEvents.SessionEnding' 이벤트가 원하는 것일 수 있습니다. 루키 [여기] (http://social.msdn.microsoft.com/Forums/vstudio/en-US/ffd0b29b-4f89-4e4e-bcb7-863532203e89/shutdown-hook-in-c?forum=csharpgeneral) –

답변

2

나는 ApplicationExit 이벤트를 듣는 것이 더 나을 것이라고 생각합니다. 이 핸들러가 실행될 때까지 실제로 종료에서 응용 프로그램을 방지 할 수 있습니다 : 더 창문이없는 경우

static void Main() 
{ 
    Application.ApplicationExit += Application_ApplicationExit; 

    ... 
} 

static void Application_ApplicationExit(object sender, EventArgs e) 
{ 
    MessageBox.Show("Exit!"); 
} 
+0

이것은 작동합니다 오히려 잘. 그것은 심지어 창문이 닫히는 것을 방지합니다! –

1
  1. SessionEnding가 발생하지 않습니다. http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.sessionending%28v=vs.110%29.aspx
  2. 을 참조하십시오. ProcessExit에는 2 초 밖에 걸리지 않습니다. 나는 그것이 로그인/로그 아웃 후 살아있을 수 있도록 하나가 서비스를 필요가 있다고 생각, 또는 당신이 그래서 창을 만들 필요가 http://msdn.microsoft.com/en-us/library/system.appdomain.processexit%28v=vs.110%29.aspx

: 메시지 상자를 표시하거나 상호 작용 아무것도 할 너무 늦기 메시지 펌프.