天天看點

用手機對電腦進行遠端關機

PS:本人一月份寫的文章,貼在這裡。

      昨天真是奔波的一天,中午烤肉逛街下午壽司看電影(陪老婆)。今天中午又是麻辣誘惑。額,不争氣的腸胃果然導緻我拉肚子了。不過,話說昨天下午在石景山萬達吃完壽司後,看了《金陵十三钗》倒是頗有感觸,這部電影(又名《處女保衛戰》)旗幟鮮明的打出了這樣口号:讓處女先走。老謀子的電影越來越不行了,首先是不知道這部電影的主題是什麼?然後是不知道這部電影的主角是什麼?最後但也是最重要的一點就是不知道這部電影到底是哪個國家拍的?片頭不少人名後面都綴着不同的國家,如日本,美國,中國等等,一片混亂。看點就是開頭不多的戰争場面,槍聲炮聲做的很逼真了,完全超越了以前戰争場面的那種稚氣,還有就是石景山萬達國際影城的音響效果确實不錯,好幾次槍聲都nearly shock the shit out of me(哈哈,開個低俗的玩笑)。影片中佟大為的華麗的怎麼看都像是根據《這個殺手不太冷》這部電影結尾時殺手陣亡的劇情模仿的以襯托個人主義重複滴斑駁了日本人死亡人數:中國人死亡人數:1:10的不争氣曆史事實啊。恩,電影不錯,讓我有收獲~

         晚上回來的時候,沒趕上最後一班地鐵,導緻我和老婆租個黑的回來,被狠狠的blackmail了幾刀,哎,傷不起。回來的時候,直接回的大運村,實驗室都沒來得及回去,是以電腦也沒關。想起導師平時讓我們注意關機,頗感愧疚,昨晚回去後想了會,決定實作用手機遠端關掉電腦的一個程式(總算扯到主題了~~)。

     第一個問題就是手機和計算機通信問題,這個确實比較棘手。首先計算機在内網,手機的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秒?)。

         把代碼貼在下面,僅供參考~

/* 

*Author:lichao 

*Date:01-14-2012 

*Description:Shutdown the computer remotely by mobile phone 

*/ 

#include<windows.h> 

#include<stdio.h> 

#define TITLE_LENGTH 256 

#define EXIT_SUCCESS 0 

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 

BOOL CALLBACK lpMyEnumFunc(HWND hwnd, LPARAM lParam) 

    TCHAR szTitle[TITLE_LENGTH]; 

    GetWindowTextW(hwnd,szTitle,TITLE_LENGTH); 

    if( 0==wcscmp(szTitle,TEXT("RemotingShutDownWorker"))) 

    { 

        BOOL *pDetected=(BOOL *)lParam; 

        *pDetected=true; 

        return 0; 

    } 

    return 1; 

int main() 

    BOOL bDetected=false; 

    BOOL *pDetected=&bDetected; 

    while(!bDetected) 

        EnumWindows(lpMyEnumFunc,(LPARAM)pDetected); 

        Sleep(5000); 

    //::MessageBoxW(NULL,TEXT("将要關機"),TEXT("遠端關機"),MB_OK); 

    system("shutdown -s -t 20"); 

    return EXIT_SUCCESS; 

     圖1是運作效果截圖,遠端關機測試很順利。最後一個問題就是怎麼通過程式把顯示器關掉,這個貌似必須通過機械開關關掉,雖然遠端關機以後,由于螢幕不在收到主機箱發來的信号會自動進入節電模式,電流估計小的和充電器沒有工作情況下差不多,是以應該不會浪費多少瓦特。但是,确實是個應該解決的問題,這個有時間再搞搞~~,先不玩了,趕快趕一個導師布置的并行算法。。。。。。

<a target="_blank" href="http://blog.51cto.com/attachment/201202/164452588.png"></a>

圖1:遠端關機效果圖

本文轉自hipercomer 51CTO部落格,原文連結:http://blog.51cto.com/hipercomer/789433

繼續閱讀