公司的电脑有时因为运行着重要程序,整夜不关机,想挂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 Files\Tencent\QQ\Bin\QQ.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++ 检测一下。
本文介绍了一个使用C#编写的控制台程序,该程序可在检测到QQ收到下线通知后自动重新登录。作者利用Windows API实现对QQ进程的控制,并提供了具体的代码示例。
544

被折叠的 条评论
为什么被折叠?



