經常碰到一種需求,就是需要監聽某些東西,就需要創建一個能在後台跑的程序.很顯然服務能滿足你的需求,不過我沒寫過服務程序,不知道具體怎麼運作的(應該是暴露幾個導出函數給操作系統),但是可以用其他的辦法到達你想要的效果.
Windows程序之所以會持久運行,就是因為其消息機制.消息循環從消息隊列裡面不斷抽取消息,分發給窗口,系統調用窗口過程.而這個類似於死循環一樣的消息循環正是程序不會退出的原因(暫時不會退出).
1 while (GetMessage(&msg,NULL,0,0))
2 {
3 TranslateMessage(&msg);
4 DispatchMessage(&msg);
5 }
想要做一個在後台跑的程序,這個消息循環是必不可少的.現在無非就是要弄一個能處理消息的東西,有兩個選擇:
直接在分發消息之前處理,在消息循環中間橫插一槓.
還是利用原來的窗口過程,讓操作系統來執行.
中間橫插一槓,看著很簡單容易理解,但是據說窗口過程是操作系統執行的,因為操作系統需要給程序分配時間片,如果你自己執行,操作系統就不知道要分配多少時間片.還是利用原來的窗口過程,創建一個窗口類,創一個窗口.我們需要做的就是,不讓那個窗口顯示出來....(除此之外,我想不到怎麼才能讓窗口句柄和窗口過程聯系起來,哪位達人知道可以指點一二)
CreateWindow創建的時候,可以指定窗口顯示不顯示.(之前在Win32上面實驗過,到WM上面實驗的時候沒注意...結果創建一個直接被顯示的窗口)
01 hWnd = CreateWindow(szWindowClass,
02 szTitle,
03 WS_DISABLED,//丫的就是這個參數
04 CW_USEDEFAULT,
05 CW_USEDEFAULT,
06 CW_USEDEFAULT,
07 CW_USEDEFAULT,
08 NULL,
09 NULL,
10 hInstance,
11 NULL);
後面VS默認生成的代碼,還會ShowWindow,UpdateWindow,只需要把這兩行注釋掉即可
1 //ShowWindow(hWnd, nCmdShow);
2 //UpdateWindow(hWnd);
剩下的就是FindWindow,SendMessage,或者PostMessage了.
PS:
這個道理在.NET CF下面也是可行的.Application.Run(Form f)其實就是一個消息循環+f.Show().你完全可以自己P/Invoke一個消息循環,至於Show不Show就是你自己的事兒了。