程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> [WM]創建一個不會退出的Console程序

[WM]創建一個不會退出的Console程序

編輯:關於.NET

經常碰到一種需求,就是需要監聽某些東西,就需要創建一個能在後台跑的程序.很顯然服務能滿足你的需求,不過我沒寫過服務程序,不知道具體怎麼運作的(應該是暴露幾個導出函數給操作系統),但是可以用其他的辦法到達你想要的效果.

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就是你自己的事兒了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved