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

如何將自己的 AP 自動被 Focused

尚未結案
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-09 10:09:23 IP:211.20.xxx.xxx 未訂閱
這問題跟 "如何將自己的window置於所有window的最上方" 不太相同.... 在 win2000 下,用盡所有的方法 如 ShowWindow(Handle) BringWindowToTop(Handle) SetForegroundWindow(Handle) SetActiveWindow(Handle) Application->BringToFront() 我的 AP 是會被帶到 Top 沒錯 但似乎不能自動被 Focused 且執行上述 API 後 底下工作列,我 AP 的小圖示會一閃一閃 表 API 有作用 , 但 就是一定要人用 MOUSE 去點一下 才會被 Focused 請問各位長官有解嗎 ??
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-09 14:37:55 IP:61.221.xxx.xxx 未訂閱
試試在ap執行時BringWindowToTop(Handle),再加上模擬鍵 keybd_event(Ord(#1),0,0,0); keybd_event(Ord(#1), 0, KEYEVENTF_KEYUP, 0); 或 keybd_event(Ord(#9),0,0,0); keybd_event(Ord(#9), 0, KEYEVENTF_KEYUP, 0); 頂著吧!!!
------
======================
昏睡~
不昏睡~
不由昏睡~
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-09 15:30:13 IP:210.208.xxx.xxx 未訂閱
果然可以 我在我
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-09 17:16:45 IP:202.39.xxx.xxx 未訂閱
參考以下兩篇, 看行不行: http://www.lmc-mediaagentur.de/dpool/tips/0385.htm http://www.lmc-mediaagentur.de/dpool/tips/0596.htm    -- Believe the unbelievable.
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-01-09 18:26:39 IP:210.208.xxx.xxx 未訂閱
hagar 長官 該範例好像是 MDI 以及偵測是否同一之程式執行兩次的範例 不過我還是取其重點程序來試看看 如 SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE); 等等 都還是不行 在我的 AP 中若有兩個 Form , 則可以將焦點任我控制指定到其中任一 Form 但 跨 AP 時就沒咋了,無法任意把 Focus 從別的 AP(如記事本) 叫回來 會有這種需求,是因我的程式是收銀機程式(沒有滑鼠只有鍵盤) Focus 一跑掉就完蛋了 發表人 - bruce0211 於 2003/01/09 18:34:43
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-01-09 18:48:58 IP:202.39.xxx.xxx 未訂閱
1.不要叫小弟長官啦! 看年紀您算長輩哩! 2.再參考這篇看看: http://www.lmc-mediaagentur.de/dpool/tips/1083.htm    -- Believe the unbelievable.
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-01-09 21:07:42 IP:210.208.xxx.xxx 未訂閱
我把程式套用後,移開焦點到記事本 馬上就發現我程式在底下工作列的小圖示一閃一閃 手動移回焦點到我 AP ,一閃一閃就停止了 這表示兩個結果 1.我程式在工作列的小圖示會一閃一閃表 API 的確有作用, Handle 也沒抓錯 2.跟我第一封信用 BringWindowToTop(Handle) 結果一樣,底下工作列圖示都是會一閃一閃,但鍵盤輸入焦點就是不會移回來 >_<~~~~~~ 記得以前在 98 從未看過 底下工作列圖示會一閃一閃 是否在 WIN2000 才會有這種"假"焦點移回的狀況 ?? 有勞各位長官了 .... void __fastcall TForm1::Timer1Timer(TObject *Sender) { DWORD Th1 = GetCurrentThreadId(); DWORD Th2 = GetWindowThreadProcessId(GetForegroundWindow,NULL); AttachThreadInput(Th2, Th1, true); try { SetForegroundWindow(Application->Handle); } __finally { AttachThreadInput(Th2, Th1, false); } }
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-01-09 22:06:54 IP:210.208.xxx.xxx 未訂閱
解決了!! 感謝各位長官,尤其是程式設計深度論壇 DelphiKao 長官 void __fastcall TForm1::Timer1Timer(TObject *Sender) { SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE); SetForegroundWindow(Application->MainForm->Handle); }
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-02-05 22:52:58 IP:210.85.xxx.xxx 未訂閱
看了文章 試了 四種方法~ 都無用耶~~ (1)保持最上層~ 但不是我要到~ 最小化後時間到也不會彈跳出來 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); (2)時間到會有焦點 但一樣 最小化後時間到也不會彈跳出來 BringWindowToTop(Handle); SetForegroundWindow(Handle); SetActiveWindow(Handle); keybd_event(VK_RETURN, (BYTE)MapVirtualKey(VK_RETURN, 0), 0, 0); //模擬按下Enter鍵 keybd_event(VK_RETURN, (BYTE)MapVirtualKey(VK_RETURN, 0), KEYEVENTF_KEYUP, 0); //模擬放開Enter鍵 (3)時間到 工作列上的視窗有被壓下的形狀 但一樣彈跳不出來 DWORD Th1 = GetCurrentThreadId(); DWORD Th2 = GetWindowThreadProcessId(GetForegroundWindow,NULL); AttachThreadInput(Th2, Th1, true); try { SetForegroundWindow(Application->Handle); } __finally { AttachThreadInput(Th2, Th1, false); } (4)時間到會有焦點~ 有時會閃~ 但一樣 最小化後時間到也不會彈跳出來 SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE); SetForegroundWindow(Application->MainForm->Handle); 看來..... 算了~ 先研究別的好了~... -___-||
loverlin
一般會員


發表:1
回覆:35
積分:22
註冊:2002-07-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-02-06 11:55:57 IP:61.228.xxx.xxx 未訂閱
這是以前從某一個大陸網站取得的(電腦重灌後忘了網址)~  傳入的 hwnd 是要跳到前景的 Handle ForceForegroundWindow(Application->MainForm->Handle); 我用 key hook 去呼叫是可以強迫跳到前景,你用定時的應該也可以  
function ForceForegroundWindow(hwnd: THandle): Boolean;
var
    ForegroundThreadID  :   DWORD;
    ThisThreadID        :   DWORD;
    timeout             :   DWORD;
begin
    if IsIconic(hwnd) then
        ShowWindow(hwnd, SW_RESTORE);        if GetForegroundWindow = hwnd then
        Result := true
    else begin
        //如果有一個視窗有鍵盤 foucs,Windows 98/2000 不會把另一個視窗切到前景
        if( ( Win32Platform = VER_PLATFORM_WIN32_NT ) and ( Win32MajorVersion > 4 ) ) or
            ( ( Win32Platform = VER_PLATFORM_WIN32_WINDOWS ) and
            ( (Win32MajorVersion > 4 ) or ( ( Win32MajorVersion = 4 ) and
            ( Win32MinorVersion > 0 ) ) ) ) then
        begin
            Result  :=  false;
            ForegroundThreadID  :=  GetWindowThreadProcessID( GetForegroundWindow , nil );
            ThisThreadID        :=  GetWindowThreadProcessId( hwnd , nil);
            if AttachThreadInput( ThisThreadID , ForegroundThreadID, true) then
            begin
                BringWindowToTop( hwnd );
                SetForegroundWindow( hwnd );
                AttachThreadInput(ThisThreadID, ForegroundThreadID, false);
                Result := (GetForegroundWindow = hwnd);
            end;
            if not Result then
            begin
                SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
                SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE);
                BringWindowToTop(hwnd);
                SetForegroundWindow(hWnd);
                SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
            end;
        end
        else begin
            BringWindowToTop(hwnd);
            SetForegroundWindow(hwnd);
        end;            Result := (GetForegroundWindow = hwnd);
    end;
end; { ForceForegroundWindow }
 
kk-boy
------
kk-boy
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-02-06 11:59:16 IP:203.73.xxx.xxx 未訂閱
請參考以下的連結
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-02-21 09:10:21 IP:210.208.xxx.xxx 未訂閱
引言: 請參考以下的連結 >< face="Verdana, Arial, Helvetica"> 該鏈結中的重點 不仍是如前幾篇所述的兩個重點?? SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE); SetForegroundWindow(Application->MainForm->Handle); 對了對了,從上次發表問題經過了這一個多月 發覺使用這兩個 API 仍有凸槌的時候 也就是經過了一個多月後, Focus 又跑不回來了 把程式放到另一台電腦又正常 不知是否跟電腦環境參數變化有關 發表人 - bruce0211 於 2003/02/21 09:17:32
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-02-21 14:31:17 IP:203.73.xxx.xxx 未訂閱
引言: 該鏈結中的重點 不仍是如前幾篇所述的兩個重點?? SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE); SetForegroundWindow(Application->MainForm->Handle); 對了對了,從上次發表問題經過了這一個多月 發覺使用這兩個 API 仍有凸槌的時候 也就是經過了一個多月後, Focus 又跑不回來了 把程式放到另一台電腦又正常 不知是否跟電腦環境參數變化有關
bruce0211 你好: 如果你有仔細看那篇連結文章,會發現仍然有一些差異存在的 我建立這個連結的目的~~只是希望以後如果有人遇到類似問題的話 能夠依照不同的需求,選擇適合的解決方式 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
chenyuzhi_2000
一般會員


發表:0
回覆:1
積分:0
註冊:2003-06-11

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-06-17 18:38:03 IP:61.138.xxx.xxx 未訂閱
//Procedure SwitchToThisWindow(hwnd:HWND;bRestore:Integer);external 'user32.dll' name 'SwitchToThisWindow';//动态链接库静态调用演示
bundur
一般會員


發表:16
回覆:44
積分:22
註冊:2002-11-30

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-06-18 13:24:08 IP:218.104.xxx.xxx 未訂閱
引言: //Procedure SwitchToThisWindow(hwnd:HWND;bRestore:Integer);external 'user32.dll' name 'SwitchToThisWindow';//动态链接库静态调用演示
该方法在 Window2003 下运行出错. 另外! 在 window2003 下得不到最小化状态, 我试过可得到 1和3却没有2 即 1 - SW_SHOWNORMAL , 2 - SW_SHOWMINIMIZED, 3 - SW_SHOWMAXIMIZED 如果程序从1进入2, 得到的是 1, 如果从 3 进入2,却得到3!
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-08-27 10:02:26 IP:211.23.xxx.xxx 未訂閱
一個非正規, 但是可行的方法, 你參考看看吧!!     
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:=false ;
  Application.Minimize ;
  Application.Restore ;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled:=true ;
end;     
...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-08-27 11:56:26 IP:211.21.xxx.xxx 未訂閱
太神奇了 這種偷吃步居然真的有效....
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-08-27 15:30:42 IP:211.23.xxx.xxx 未訂閱
哈哈哈哈... 有時正規的解法搞不出來, 只好用一些旁門左道... :) ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
erin_wang
一般會員


發表:0
回覆:1
積分:0
註冊:2003-09-15

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-12-17 15:05:09 IP:61.218.xxx.xxx 未訂閱
我在 windows 2000 下, 試用包子哥的方法, 再加紅色那行, 就可以了    if(IsIconic(Application->Handle)){         ShowWindow(Application->Handle, SW_NORMAL); } else{     SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0,   SPIF_SENDCHANGE);      SetForegroundWindow(Application->MainForm->Handle); } Application->NormalizeAllTopMosts();
lewis
一般會員


發表:1
回覆:3
積分:0
註冊:2002-04-22

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-07-27 16:35:59 IP:203.67.xxx.xxx 未訂閱
綜合以上的方法,以下內容是我在 XP 環境下,測試出來沒有問題的 void __fastcall TForm1::AppActivate(TObject *Sender) { SetForegroundWindow(Application->Handle); // 滑鼠鎖定 RECT region; region.left = Left 4; region.top = Top Height - ClientHeight - 4; region.right = Left Width - 4; region.bottom = Top Height - 4; ClipCursor(®ion); } void __fastcall TForm1::AppDeactivate(TObject *Sender) { SetForegroundWindow(Application->Handle); keybd_event(VK_RETURN, (BYTE)MapVirtualKey(VK_RETURN, 0), 0, 0); //模擬按下Enter鍵 keybd_event(VK_RETURN, (BYTE)MapVirtualKey(VK_RETURN, 0), KEYEVENTF_KEYUP, 0); //模擬放開Enter鍵 } void __fastcall TForm1::FormCreate(TObject *Sender) { Application->OnActivate = AppActivate; Application->OnDeactivate = AppDeactivate; } 希望能幫助到其他人!
nicolas
一般會員


發表:39
回覆:40
積分:15
註冊:2004-05-05

發送簡訊給我
#21 引用回覆 回覆 發表時間:2004-12-01 16:26:31 IP:61.219.xxx.xxx 未訂閱
void __fastcall TForm1::Timer1Timer(TObject *Sender) { SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE);請問這一行是必要的嗎? 謝謝 SetForegroundWindow(Application->MainForm->Handle); }
dky
一般會員


發表:12
回覆:30
積分:13
註冊:2004-06-24

發送簡訊給我
#22 引用回覆 回覆 發表時間:2011-01-21 17:23:32 IP:114.32.xxx.xxx 訂閱
請問各位大大
我遇到怪問題
若一直把自己強迫設焦點, 萬一程式出現錯誤訊息, 會被自己的視窗蓋住, 請問有得解嗎.
系統時間:2024-11-23 11:48:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!