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

如何偵測tray icon 所在座標

缺席
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-02 21:50:41 IP:61.67.xxx.xxx 未訂閱
請問各位三個問題:

我利用這幾組參數寫了一支Service 的程式, 這是一支自動備份指定檔案的程式
procedure AddServiceIcon();
procedure DelServiceIcon();
procedure ServiceMessage(var Msg: TMessage); message WM_PAOSERVICEMESSAGE;
procedure QueryEndSession(var Msg: TMessage); message WM_QUERYENDSESSION;

已經順利將程式加入到tray 中的icon, 如圖一(紅圈部份)


如今我想要在自動備份啟動時show一個form出來, 而這個form是跟隨icon相關位置顯示出來, 因為每一家的icon數不一定, 所以我希望form的啟始位置是可以在這個icon left 位置開始秀出來,
問題一, 如何取得 目前 icon 在scrren中的x,y座標, 如果我設定取得 BackupServiceForm.left (BackupServiceForm 是這個mainForm name), 得到的是這個main form 的位置, 而不是在tray 中icon位置, 所以有何函式可以抓到紅圈的x,y座標?
問題二, 當我以service模式寫這支程式, 如果我是這樣使用mainform的語法

if (Msg.LParam = WM_LBUTTONDBLCLK) then begin
Label9.Caption:= 'x:' InttoStr(BackupServiceForm.Left);
Label10.Caption:= 'y:' InttoStr(BackupServiceForm.Top);
Show();
end;
當本段被執行時會有錯誤發生, 但如果我改成下列, 就沒有問題, 也就是說, 以Service在跑的程式無法加入該Formname
BackupServiceForm.xxxxx 的方式, 這是為何? 若是以Application 則是沒有問題的, 換句話說, 如果我有好幾個form在service中, form2 就無法直接引用 BackupServiceForm 中的元件或public 變數, 我必須另外設定unit 來存取 bacupServiceForm 中的變數再傳到 form2 之中, 很麻煩
if (Msg.LParam = WM_LBUTTONDBLCLK) then begin
Label9.Caption:= 'x:' InttoStr(left);
Label10.Caption:= 'y:' InttoStr(top);
Show();
end;

問題三
我發現, 如果被寫成Service mode 時, edit 類的元件無法輸入, 但在Application 下是正常的, 可是如
spinedit, combox, listbox 等卻又可以選擇, 是否service 下真的會被鎖定edit 之類無法輸入
如圖

編輯記錄
P.D. 重新編輯於 2007-11-02 21:59:27, 註解 無‧
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-09 10:22:30 IP:203.79.xxx.xxx 訂閱
問題一, 如何取得 目前 icon 在scrren中的x,y座標
因為你是用 Mouse在 icon 點選, 可以使用 GetCursorPos 取得目前 Mouse 所在座標
至於 Screen
座標與 TPoint 的轉換要用 ScreenToClient & ClientToScreen

就我所知問題二,三可能要將 Service 與 Form 界面分開寫, 不過這部份我沒寫過

===================引 用 P.D. 文 章===================
請問各位三個問題:

我利用這幾組參數寫了一支Service 的程式, 這是一支自動備份指定檔案的程式
procedure AddServiceIcon();
procedure DelServiceIcon();
procedure ServiceMessage(var Msg: TMessage); message WM_PAOSERVICEMESSAGE;
procedure QueryEndSession(var Msg: TMessage); message WM_QUERYENDSESSION;

已經順利將程式加入到tray 中的icon, 如圖一(紅圈部份)


如今我想要在自動備份啟動時show一個form出來, 而這個form是跟隨icon相關位置顯示出來, 因為每一家的icon數不一定, 所以我希望form的啟始位置是可以在這個icon left 位置開始秀出來,
問題一, 如何取得 目前 icon 在scrren中的x,y座標, 如果我設定取得 BackupServiceForm.left (BackupServiceForm 是這個mainForm name), 得到的是這個main form 的位置, 而不是在tray 中icon位置, 所以有何函式可以抓到紅圈的x,y座標?
問題二, 當我以service模式寫這支程式, 如果我是這樣使用mainform的語法

if (Msg.LParam = WM_LBUTTONDBLCLK) then begin
Label9.Caption:= 'x:' InttoStr(BackupServiceForm.Left);
Label10.Caption:= 'y:' InttoStr(BackupServiceForm.Top);
Show();
end;
當本段被執行時會有錯誤發生, 但如果我改成下列, 就沒有問題, 也就是說, 以Service在跑的程式無法加入該Formname
BackupServiceForm.xxxxx 的方式, 這是為何? 若是以Application 則是沒有問題的, 換句話說, 如果我有好幾個form在service中, form2 就無法直接引用 BackupServiceForm 中的元件或public 變數, 我必須另外設定unit 來存取 bacupServiceForm 中的變數再傳到 form2 之中, 很麻煩
if (Msg.LParam = WM_LBUTTONDBLCLK) then begin
Label9.Caption:= 'x:' InttoStr(left);
Label10.Caption:= 'y:' InttoStr(top);
Show();
end;

問題三
我發現, 如果被寫成Service mode 時, edit 類的元件無法輸入, 但在Application 下是正常的, 可是如
spinedit, combox, listbox 等卻又可以選擇, 是否service 下真的會被鎖定edit 之類無法輸入
如圖
------
將問題盡快結案也是一種禮貌!
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-09 17:05:54 IP:125.225.xxx.xxx 未訂閱
我之前在CodeProject看過這個問題的文章
你可以用tray icon當關鍵字搜尋看看
11.17 看看是不是這個範例
http://delphi.ktop.com.tw/download.php?download=upload/473e651f06eeb_TrayIcon.zip
編輯記錄
bugmans 重新編輯於 2007-11-17 11:47:04, 註解 無‧
bugmans 重新編輯於 2007-11-17 11:51:16, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-11 01:47:17 IP:61.67.xxx.xxx 未訂閱
 站上我曾經找過似乎沒有看過, 網路上一找上萬條, 很難一條一條仔細看, 看完大概一個月也過去了,  所以才會想偷懶一下問問看有沒有前輩知道, 無論如何還是感謝回覆
系統時間:2024-05-07 0:39:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!