概述
公司的电脑有时因为运行着重要程序,整夜不关机,想挂QQ。但是,下班回到家,一旦登录QQ,公司电脑挂的QQ就自动退出了。晚上睡觉,关掉电脑,公司电脑却不能再挂机了。
为此,我用C#写了一个控制台程序,凌晨0点(我通常晚上11点睡觉)检测一下QQ,看它是否收到了下线通知。一旦收到了,就先退出QQ程序,然后再次启动QQ------注意:公司电脑QQ要设成“记住密码”、“启动QQ时自动登录”。
检测QQ
---------
刚开始,我用类Process提供的方法,有两个问题无法解决:
1.它无法判断QQ是否正常运行,或是收到了下线通知;
2.使用它提供的CloseMainWindow方法,无法退出QQ。正如MSDN对该方法的评价------“调用 CloseMainWindow 会向主窗口发送关闭请求,在一个格式良好的应用程序中,该请求会关闭子窗口并撤消此应用程序所有正在运行的消息循环。通过调用 CloseMainWindow 发出的退出进程的请求不强制应用程序退出。应用程序可以在退出前请求用户验证,也可以拒绝退出。”
按照MSDN的说明,万不得已可以使用kill方法,只是QQ进程被关掉了,任务栏的企鹅图标还存在。在QQ再次登录时,任务栏就会多出一个。也就是说,每执行一次kill,就会产生一个。
windows API
----------------
在网上查到《Kill any application with system menu using C# 》,用c#调用windows API,借助visual studio自带的 Microsoft Spy++ 来获取QQ程序窗口的类名和窗口名 作为 API的两个参数,就可以了。
特性DllImport需要引入 using System.Runtime.InteropServices;
代码
-----
static void Main(string[] args) { Process[] myProcess = Process.GetProcesses(); if (isOffLine()) { closeQQ(); Thread.Sleep(2000); startQQ(); } } static void closeQQ() { int iHandle = Win32.FindWindow("TXGuiFoundation", "QQ2010");//改成你电脑上的实际检测结果 int j = Win32.SendMessage(iHandle, Win32.WM_SYSCOMMAND, Win32.SC_CLOSE, 0); } static void startQQ() { Process qq = new Process(); qq.StartInfo.FileName = @"D:Program FilesTencentQQBinQQ.exe";//改成你电脑上QQ的实际地址 qq.Start(); } static bool isOffLine() { bool flag = false; int iHandle = Win32.FindWindow("TXGuiFoundation", "下线通知"); if (iHandle > 0) { flag = true; } return flag; }
补充
---------
我用的QQ版本是昨天从官网刚下载的,其他版本的窗口名可能需要用 Microsoft Spy++ 检测一下。
最后
以上就是悲凉荔枝为你收集整理的让被迫下线的QQ重新自动登录!的全部内容,希望文章能够帮你解决让被迫下线的QQ重新自动登录!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复