如何在 Noninteractive Service 內安全的使用MessageBox |
|
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
有寫過 Noninteractive Service 的人都應該知道, 只要在該Service內呼叫
MessageBox(), Service 就會被咬住, 不但MessageBox秀不出來, 還會造成
Service 無法正常執行. 但是若在你的Service內有需要跳出一個錯誤訊息給使用者看時該怎麼辦呢? 下面這個小技巧可以讓你達到這個需求, 其實就是設定行程的Window Station和Desktop
var hWinstaSave: HWINSTA; hDeskSave: HDESK; hWinstaUser: HWINSTA; hDeskUser: HDESK; ... ... ... if 發生錯誤 then begin // 開啟 Service 所在的 Window Station, 並保存之. hWinstaSave := GetProcessWindowStation(); // 開啟 Service 所在的 Desktop, 並保存之. hDeskSave := GetThreadDesktop(GetCurrentThreadId); // 開啟目前使用者的 Window Station hWinstaUser := OpenWindowStation('WinSta0', FALSE, MAXIMUM_ALLOWED); if (hWinstaUser = 0) then begin // 開啟目前使用者的 Window Station 失敗 Exit; end; // 設定 Service 的 Window Station 為目前使用者的 Window Station SetProcessWindowStation(hWinstaUser); // 開啟目前使用者的預設 Desktop hDeskUser := OpenDesktop('Default', 0, FALSE, MAXIMUM_ALLOWED); if (hDeskUser = 0) then begin // 開啟失敗, 還原 Service 的 Window Station. SetProcessWindowStation(hWinstaSave); CloseWindowStation(hWinstaUser); Exit; end; // 設定 Service 的 Desktop 為目前使用者的 Desktop SetThreadDesktop(hDeskUser); // 顯示 Dialog. MessageBox(GetForegroundWindow, 'Test Dialog', 'MessageBox', MB_OK); // 還原 Service 的 Window Station, Desktop. SetThreadDesktop(hDeskSave); SetProcessWindowStation(hWinstaSave); CloseDesktop(hDeskUser); CloseWindowStation(hWinstaUser); end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |