用手机对电脑进行远程关机

PS:本人一月份写的文章,贴在这里。

昨天真是奔波的一天,中午烤肉逛街下午寿司看电影。今天中午又是麻辣诱惑。额,不争气的肠胃果然导致我拉肚子了。不过,话说昨天下午在石景山万达吃完寿司后,看了《金陵十三钗》倒是颇有感触,这部电影(又名《处女保卫战》)旗帜鲜明的打出了这样口号:让处女先走。老谋子的电影越来越不行了,首先是不知道这部电影的主题是什么?然后是不知道这部电影的主角是什么?最后但也是最重要的一点就是不知道这部电影到底是哪个国家拍的?片头不少人名后面都缀着不同的国家,如日本,美国,中国等等,一片混乱。看点就是开头不多的战争场面,枪声炮声做的很逼真了,完全超越了以前战争场面的那种稚气,还有就是石景山万达国际影城的音响效果确实不错,好几次枪声都nearly shock the shit out of me(哈哈,开个低俗的玩笑)。影片中佟大为的华丽的怎么看都像是根据《这个杀手不太冷》这部电影结尾时杀手阵亡的剧情模仿的以衬托个人主义重复滴斑驳了日本人死亡人数:中国人死亡人数1:10的不争气历史事实啊。恩,电影不错,让我有收获~

晚上回来的时候,没赶上最后一班地铁,哎,伤不起。回来的时候,实验室都没来得及回去,所以电脑也没关。想起导师平时让我们注意关机,颇感愧疚,昨晚回去后想了会,决定实现用手机远程关掉电脑的一个程序(总算扯到主题了~~)。

第一个问题就是手机和计算机通信问题,这个确实比较棘手。首先计算机在内网,手机的ip也是随机分配,两者要实现无缝对接,必须有一个外网IP的服务器,手机和计算机的客户端都主动登录到这个服务器上,然后才能对接。这个,搭个服务器太麻烦(希望IPV6能赶快普及啊~~)。其实,仔细想想我们可以利用现有的手机和计算机的点对点通信工具,比如飞信,QQ之类的,还有就是使用邮件。

使用邮件的解决方案就是,通过手机给自己发送一封邮件,然后再计算机上跑一个守护进程,定期扫描邮箱,并去读邮件,根据主题(例如:关机?)再实施关机动作。可以使用Python实现,工作量应该不是很大(MAX:3 hours).这个缺点就是实时性不太好,还是使用现有的即时通信工具实时性好点。

我选择的方案就是使用QQ,你需要注册两个QQ,一个是你的计算机端上运行的QQ,表示为QQC吧。另一个就是你的手机上运行的QQ,表示QQT吧。在QQC上给QQT好友命名,命名尽量复杂点,这样可以避免一些事故,具体原因后面看了就会知道。这里选择命名为“RemotingShutDownWorker”,然后把QQC设置为弹窗模式(就是有一条新的消息后,弹出发送消息者的窗口)。这样QQT向QQC发送一个消息之后就会弹出一个窗体,窗体的标题就是“RemotingShutDownWorker”。

基于这一点,应该首先这样一个程序,它定期扫描当前屏幕最顶层的所有窗体的标题,如果发现有标题为“RemotingShutDownWorker”时执行关机操作。选择编程语言为C语言,编程环境是VS2010,使用的模板为WIN32 CONSOLE APPLICATION。

另外还需要注意的几个地方就是:

l  程序运行过程中不需要显示窗体

l  程序应该能够开机自启

l  程序应该每间隔一段时间扫描一次,否则CPU亚历山大

第一点,比较容易实现,在程序中添加一句“#pragma comment(linker,”/subsystem:\”windows\” /entry:\”mainCRTStartup\””)”就可以了。第二点,自启的话也很简单,把这个可执行程序的快捷方式拷贝到Windows启动文件夹中就哦了。第三点,调用Sleep函数,设置一个间隔时间(例如:5秒?)。

把代码贴在下面,仅供参考~


  1. /*
  2. *Author:lichao
  3. *Date:01-14-2012
  4. *Description:Shutdown the computer remotely by mobile phone
  5. */
  6. #include<windows.h>
  7. #include<stdio.h>
  8. #define TITLE_LENGTH 256
  9. #define EXIT_SUCCESS 0
  10. #pragma comment(linker,”/subsystem:\”windows\” /entry:\”mainCRTStartup\””)
  11. BOOL CALLBACK lpMyEnumFunc(HWND hwnd, LPARAM lParam)
  12. {
  13.     TCHAR szTitle[TITLE_LENGTH];
  14.     GetWindowTextW(hwnd,szTitle,TITLE_LENGTH);
  15.     if( 0==wcscmp(szTitle,TEXT(“RemotingShutDownWorker”)))
  16.     {
  17.         BOOL *pDetected=(BOOL *)lParam;
  18.         *pDetected=true;
  19.         return 0;
  20.     }
  21.     return 1;
  22. }
  23. int main()
  24. {
  25.     BOOL bDetected=false;
  26.     BOOL *pDetected=&bDetected;
  27.     while(!bDetected)
  28.     {
  29.         EnumWindows(lpMyEnumFunc,(LPARAM)pDetected);
  30.         Sleep(5000);
  31.     }
  32.     ::MessageBoxW(NULL,TEXT(“将要关机”),TEXT(“远程关机”),MB_OK);
  33.     system(“shutdown -s -t 20”);
  34.     return EXIT_SUCCESS;
  35. }

图1是运行效果截图,远程关机测试很顺利。最后一个问题就是怎么通过程序把显示器关掉,这个貌似必须通过机械开关关掉,虽然远程关机以后,由于屏幕不在收到主机箱发来的信号会自动进入节电模式,电流估计小的和充电器没有工作情况下差不多,所以应该不会浪费多少瓦特。但是,确实是个应该解决的问题,这个有时间再搞搞~~,先不玩了,赶快赶一个导师布置的并行算法。。。。。。

远程关机效果图

图1:远程关机效果图