代码在程序关闭和pc关闭时运行

时间:2014-10-08 13:05:04

标签: c# shutdown application-close

我有一个无形的应用程序,作为系统托盘应用程序运行。我很难在计算机关闭或应用程序关闭时运行代码。

这是我到目前为止所拥有的

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;
        }            
    }
}

我的问题是,当通过visual studio内部的调试器运行时,上面的代码可以正常工作(只测试程序关闭)。如果我在外面运行它,消息框永远不会出现。

2 个答案:

答案 0 :(得分:2)

我认为听一下ApplicationExit事件可能会更好。在执行处理程序之前,它将阻止应用程序实际退出:

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

    ...
}

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

答案 1 :(得分: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
  3. 我认为你需要一个服务才能在登录/注销后保持活力,或者你需要创建一个窗口以便你有一个消息泵。