[C#]实现Q+桌面登录满5小时后自动退出(QQ等级加速用)

由于Q+桌面和QQ同时在线5小时可加速0.2天,

没事做了本程序当练手用,实现自动监控QPLUS到5小时后关闭.
本程序为控制台程序,启动后在后台自动运行、有系统托盘并设置了开机启动

功能

1.如本程序运行时,Q+桌面还未运行,将自动运行Q+桌面
2.自动监控QQ是否关联到Q+,如果Q+桌面没有关联到QQ帐号,5分钟提醒一次(只提醒3次,提醒太多会很烦人的)
3.Q+桌面和QQ同时在线5小时后即自动退出.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Timers;
using Microsoft.Win32;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;

//确定QPLUS已经运行5小时就自动关闭QPLUS
namespace SHUTQQPLUS
{
    class Program
    {

        static TimeSpan waste = new TimeSpan(0);//未关联的时间
        static string filePath = "";//Q+安装路径
        static int iflag = 0;//关联标志
        public static int icount = 3;//提醒次数
        static System.Timers.Timer Timer2 = new System.Timers.Timer(); //定时器2 

        //实现系统托盘
        static NotifyIcon _NotifyIcon = new NotifyIcon();

        static void Main(string[] args)
        {
            //防止多个程序运行
            Process[] ps = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
            if (ps.Length > 1)
            {
                MessageBox.Show("程序已运行!");
                return;
            }

            try
            {
                if (checkInstall() == false)
                {
                    MessageBox.Show("Q+桌面未安装!");
                    return;//终止程序
                }
                
                MessageBox.Show("注意:程序将自动在后台运行!");
                Process[] processes = Process.GetProcessesByName("qplus");
                while(processes.Length == 0)
                {
                    //自动运行Q+桌面
                      ProcessStartInfo p = new ProcessStartInfo();
                    p.FileName = filePath;
                    p.WindowStyle = ProcessWindowStyle.Normal;
                    Process pr = Process.Start(p);
                    processes = Process.GetProcessesByName("qplus");
                }
                //设置程序为开机启动
                #region
                RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);//打开注册表子项 
                if ((key.GetValue("SHUTQQPLUS") == null))//判断是否已经是开机启动
                {
                    if (System.Environment.Is64BitOperatingSystem == true)//64位系统
                    {
                        key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run", true);//打开注册表子项 
                        if (key == null)//如果该项不存在的话,则创建该子项             
                        {
                            key = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run");
                        }
                    }
                    else
                    {
                        if (key == null)//如果该项不存在的话,则创建该子项             
                        {
                            key = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
                        }
                    }
                    key.SetValue("SHUTQQPLUS", Environment.CommandLine);//设置为开机启动                     
                    key.Close();
                }
                #endregion

                System.Timers.Timer Timer1 = new System.Timers.Timer(); //定时器1 
                Timer1.Elapsed += new ElapsedEventHandler(TimeEvent);
                Timer1.Interval = 3600000;//设置间隔时间为1小时
                Timer1.Enabled = true;

                Timer2.Elapsed += new ElapsedEventHandler(TimeEvent2);
                Timer2.Interval = 30000;//设置间隔时间为5分钟
                Timer2.Enabled = true;

                
                ShowNotifyIcon();//设置系统托盘
                _NotifyIcon.MouseDoubleClick += new MouseEventHandler(_NotifyIcon_MouseDoubleClick);
                _NotifyIcon.Click += new System.EventHandler(_NotifyIcon_Click);
                while (true) { Application.DoEvents(); };
            }
            catch
            {
                MessageBox.Show("出现未知错误");
            }


        }
        private static void TimeEvent(object source, ElapsedEventArgs e) //定时器时间 检测是否满5小时
        {
            try
            {
                Process[] processes = Process.GetProcessesByName("qplus");
                DateTime now = System.DateTime.Now;
                if (1 == iflag)
                {
                    foreach (Process p in processes)
                    {
                        foreach (ProcessModule fp in p.Modules)
                        {
                            if (fp.ModuleName.ToString() == "TXPFProxy.dll")//判断是否关联到QQ的进程
                            {
                                if ((now - p.StartTime - waste).Hours.CompareTo(5) >= 0)//判断运行时间大于5小时
                                {
                                    p.Kill();
                                    MessageBox.Show(p.ProcessName + "[" + p.Id + "]:" + "成功关闭!");
                                    Environment.Exit(0);//关闭Q+后终止程序
                                }
                            }
                        }
                    }
                }
                else
                {
                    return;//没有关联的话 不去检测是否大于5小时
                }
            }
            catch
            {
                MessageBox.Show("关闭进程qplus失败,出现错误!");
            }
        }

        private static void TimeEvent2(object source, ElapsedEventArgs e) //定时器时间 每5分钟检测一次Q+是否已经关联到QQ
        {
            if (1 == iflag) Timer2.Enabled = false;//如果已经关联了,则关闭定时器2
            try
            {
                Process[] processes = Process.GetProcessesByName("qplus");
                DateTime now = System.DateTime.Now;
                if (iflag == 0)
                {
                    foreach (Process p in processes)
                    {
                        foreach (ProcessModule fp in p.Modules)
                        {
                            if (fp.ModuleName.ToString() == "TXPFProxy.dll")//判断是否关联到QQ的进程
                            {
                                iflag = 1;
                                waste = System.DateTime.Now - p.StartTime;//没关联之前的时间不算
                            }
                        }
                        if (iflag == 0 && icount != 0)
                        {
                            icount--;
                            MessageBox.Show(p.ProcessName + "没有关联到QQ帐号,请尽快将Q+桌面关联到QQ帐号!");

                        }
                    }
                }
            }
            catch
            {
                MessageBox.Show("关闭进程qplus失败,出现错误!");
            }
        }
        //实现系统托盘
        public static void ShowNotifyIcon()
        {
            _NotifyIcon.Icon = new Icon(System.Windows.Forms.Application.StartupPath + "\\logo_16.ico");//系统托盘图标 
            _NotifyIcon.Visible = false;
            _NotifyIcon.Text = "Q+运行监控中...";
            ContextMenu menu = new ContextMenu();
            MenuItem item = new MenuItem();
            item.Text = "退出";
            item.Index = 0;
            menu.MenuItems.Add(item);

            _NotifyIcon.ContextMenu = menu;
            _NotifyIcon.Visible = true;
            _NotifyIcon.ShowBalloonTip(3000, "", "程序已运行!", ToolTipIcon.None);
        }
        public static void HideNotifyIcon() { _NotifyIcon.Visible = false; }

        private static void _NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            MessageBox.Show("程序已运行!!!");
        }

        private static void _NotifyIcon_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("确定退出程序?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                Environment.Exit(0);//终止程序
        }

        //检查QPLUS是否安装
        private static bool checkInstall()
        {
            Microsoft.Win32.RegistryKey uninstallNode = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
            if (System.Environment.Is64BitOperatingSystem == true)//64位系统
                uninstallNode = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall");

            foreach (string subKeyName in uninstallNode.GetSubKeyNames())
            {
                Microsoft.Win32.RegistryKey subKey = uninstallNode.OpenSubKey(subKeyName);
                object displayName = subKey.GetValue("DisplayName");
                if (displayName != null)
                {
                    if (displayName.ToString().Contains("Q+桌面"))
                    {
                        filePath = subKey.GetValue("InstallLocation").ToString() + "\\QPlus.exe";
                        return true;
                    }
                }
            }

            return false;
        }

    }
}

下载地址:

http://pan.baidu.com/share/link?shareid=491334&uk=2449788611
纯粹为了练习C#而写的,大神别笑!

--

请注意:现在已经没有"Q+桌面和QQ同时在线5小时可加速0.2天"的QQ等级加速了。

你可能感兴趣的:([C#]实现Q+桌面登录满5小时后自动退出(QQ等级加速用))