全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:894
推到 Plurk!
推到 Facebook!

如何在 Noninteractive Service 內安全的使用MessageBox

 
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-22 21:39:45 IP:61.64.xxx.xxx 未訂閱
有寫過 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;    
系統時間:2024-09-29 9:06:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!