線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2594
推到 Plurk!
推到 Facebook!

如何判斷應用程式是否為最上層

尚未結案
deal
一般會員


發表:6
回覆:33
積分:22
註冊:2003-04-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-08 16:25:58 IP:163.29.xxx.xxx 未訂閱
聽從版主的建議,重新發問好了 先說明一下,我是用 > 請大家說說自己的想法吧!!謝謝嘍!!
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-08 22:33:53 IP:61.228.xxx.xxx 未訂閱
當使用者在其TrayIcon上觸發mouse click動作後,若此程式處於所謂的Iconic的狀態,則還原此程式並帶到最上層。 這是 TrayIcon 原有的功能所以不做任何動作 但若不是在Iconic的狀態下,則要先判斷此程式的Form(不管是不是MainForm)是否位於最上層 可以用 if (GetForegroundWindow() == Handle) 來得知目前是否位於最上層 若是,則將其最小化 WindowState = wsMinimized; 但若不是,則是要帶到最上層 SetForegroundWindow(Handle); Jesse Chan
------
Jesse Chan
deal
一般會員


發表:6
回覆:33
積分:22
註冊:2003-04-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-09 09:16:07 IP:163.29.xxx.xxx 未訂閱
引言: 但若不是在Iconic的狀態下,則要先判斷此程式的Form(不管是不是MainForm)是否位於最上層 可以用 if (GetForegroundWindow() == Handle) 來得知目前是否位於最上層 若是,則將其最小化 WindowState = wsMinimized; 但若不是,則是要帶到最上層 SetForegroundWindow(Handle); Jesse Chan
Hi: 你的方法我試過,但是if (GetForegroundWindow() == Handle)不知為何永遠都是false,此外,這個方法有個問題,因為我的應用程式不只一個
johnny_1121
一般會員


發表:12
回覆:58
積分:24
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-09 09:38:04 IP:192.72.xxx.xxx 未訂閱
void __fastcall TMainForm::ShowOrHideFormPopupMenuClick(TObject *Sender)
{
    if(!bFormShowed){
        ShowWindow(Application->Handle,SW_SHOW);
        SendMessage(Application->Handle,WM_SYSCOMMAND,(WPARAM)SC_RESTORE,0);
        bFormShowed = true;
    }
    else{
        SendMessage(Application->Handle,WM_SYSCOMMAND,(WPARAM)SC_MINIMIZE,0);
        ShowWindow(Application->Handle,SW_HIDE);
        bFormShowed = false;
    }
}
提供給你參考!
deal
一般會員


發表:6
回覆:33
積分:22
註冊:2003-04-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-09 09:58:44 IP:163.29.xxx.xxx 未訂閱
引言:
void __fastcall TMainForm::ShowOrHideFormPopupMenuClick(TObject *Sender)
{
    if(!bFormShowed){
        ShowWindow(Application->Handle,SW_SHOW);
        SendMessage(Application->Handle,WM_SYSCOMMAND,(WPARAM)SC_RESTORE,0);
        bFormShowed = true;
    }
    else{
        SendMessage(Application->Handle,WM_SYSCOMMAND,(WPARAM)SC_MINIMIZE,0);
        ShowWindow(Application->Handle,SW_HIDE);
        bFormShowed = false;
    }
}
提供給你參考! < face="Verdana, Arial, Helvetica"> 先謝謝1121的回答,但用flag的方式我也試過,有個問題是當原本我的應用程式是在最上層時,照說此flag應是true,但當使用者按下別的應用程式視窗後,此時我的應用程式就會被蓋過去,但flag還是沒變啊!!!除非有什麼方法可以知道我的應用程式被蓋住 我有個想法是我想試,但一直不知如何下手,提供大家想想是否此法是可行,若是的話那要怎麼做呢?其實我要的功能就像是使用者在下方工作列我的應用程式所佔的區域(我不知道那要叫什麼東東)按下滑鼠左鍵的功能。比如我開了 >)
johnny_1121
一般會員


發表:12
回覆:58
積分:24
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-09 10:14:38 IP:192.72.xxx.xxx 未訂閱
實作過和FlashGet的操作界面相同並也能StayOnTop 但還是不明瞭你的需求… 直覺你應該要 >
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-09 18:34:45 IP:61.231.xxx.xxx 未訂閱
以下是一個解法,但假設前題是「最上層的視窗」應該會是 Active 的視窗。 只要這個條件成立,那以下的程式碼應該可以解決您的問題。
//----------------------------------------------------------------------------//
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  Application->this->FormActivate;
  Application->this->FormDeactivate;
}
//----------------------------------------------------------------------------//
void __fastcall TForm1::FormActivate(TObject *Sender)
{
  ListBox1->Items->Add(Now().FormatString("hhnnss") "我是 Active 應該在最上層");
}
//----------------------------------------------------------------------------//    void __fastcall TForm1::FormDeactivate(TObject *Sender)
{
  ListBox1->Items->Add(Now().FormatString("hhnnss") "我已 Deactive 應該不在最上層");
}
//----------------------------------------------------------------------------//
沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://big5.to/吃軟也吃硬 http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-09 18:38:21 IP:61.231.xxx.xxx 未訂閱
對了,您必需另外加入旗標,就可以判斷目前是否在最上層了。 另外,這段程式並沒有判斷多個 form 或 TrayIcon click 時顯示 form 的狀況上,只是一個可能的解法。 當然也可能不是  <>沒空更新的網頁... href="http://big5.to/吃軟也吃硬">http://big5.to/吃軟也吃硬 http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
China Join
中階會員


發表:81
回覆:242
積分:89
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-10 07:18:21 IP:61.216.xxx.xxx 未訂閱
先用 FindWindow() 找你要的視窗名稱,然後用 GetForegroundWindow() 看看他是不是在最上面(作用中視窗),不就得了!只有程式設計結構的問題,API 是不可能出問題的。
deal
一般會員


發表:6
回覆:33
積分:22
註冊:2003-04-07

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-10 09:45:32 IP:163.29.xxx.xxx 未訂閱
哇!謝謝各位的回應,我想我知道問題的徵結點了,但我不知如何解決,可否請大家想想辦法。 根據GetForegroundWindow()的說明,其實此函式是得到「作用中」的HWND,而不是最上層的HWND,所以當我在TrayIcon上mouse click時用GetForegroundWindow()所捉到的應該是TrayIcon的HWND才是(謝謝1121的提醒),因此對於dllee的解法我想應該是無法達到了(我試過的確不行),所以我想請問有沒有什麼API是真的可以捉到最上層視窗,或是可以知道視窗的z-order值,或許就可以做到我要的功能了!!
johnny_1121
一般會員


發表:12
回覆:58
積分:24
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-10 10:20:46 IP:192.72.xxx.xxx 未訂閱
引言: 根據GetForegroundWindow()的說明,其實此函式是得到「作用中」的HWND,而不是最上層的HWND,所以當我在TrayIcon上mouse click時用GetForegroundWindow()所捉到的應該是TrayIcon的HWND才是(謝謝1121的提醒),因此對於dllee的解法我想應該是無法達到了(我試過的確不行),所以我想請問有沒有什麼API是真的可以捉到最上層視窗,或是可以知道視窗的z-order值,或許就可以做到我要的功能了!!
TScreen的ActiveForm,再取得Caption比對…怎樣?
deal
一般會員


發表:6
回覆:33
積分:22
註冊:2003-04-07

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-10 10:42:14 IP:163.29.xxx.xxx 未訂閱
引言: TScreen的ActiveForm,再取得Caption比對…怎樣? < face="Verdana, Arial, Helvetica"> 我試過了,還是不行,以下是有關>> 我的英文雖然不好,但我覺的它的意思應該是<>不論應用程式是否在最上層(>,這好像不能判斷我的應用程式視窗是否在最上層說。
系統時間:2024-04-29 19:45:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!