在 Windows Mobile 開發中,若需背景持續執行的程式(如監聽服務),雖然可撰寫 Windows Service,但也可利用訊息迴圈機制讓一般 Console/視窗應用程式長期駐留記憶體。Windows 程式之所以能持續執行,核心在於訊息迴圈不斷從佇列取出訊息並分發給視窗程序:
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
建立一個不顯示的視窗類別與視窗實例,即可擁有訊息處理能力。關鍵在 CreateWindow 時指定 WS_DISABLED 樣式,並註解掉預設的 ShowWindow 與 UpdateWindow:
hWnd = CreateWindow(szWindowClass, szTitle, WS_DISABLED, // 關鍵:停用視窗使其不可見
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
// ShowWindow(hWnd, nCmdShow); // 註解掉
// UpdateWindow(hWnd); // 註解掉
此視窗雖不可見,但擁有有效的 HWND 與視窗程序,可透過 FindWindow、SendMessage、PostMessage 進行跨程式通訊。
Application.Run(Form f) 本質即為訊息迴圈 + f.Show()。開發者可自行 P/Invoke 訊息迴圈,決定是否呼叫 Show,同樣能達到背景常駐效果。