如何將自己的 AP 自動被 Focused |
尚未結案
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
這問題跟 "如何將自己的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 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
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 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
我把程式套用後,移開焦點到記事本
馬上就發現我程式在底下工作列的小圖示一閃一閃
手動移回焦點到我 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 發送簡訊給我 |
|
builder78
初階會員 發表:36 回覆:100 積分:47 註冊:2003-02-03 發送簡訊給我 |
看了文章 試了 四種方法~ 都無用耶~~ (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 發送簡訊給我 |
這是以前從某一個大陸網站取得的(電腦重灌後忘了網址)~
傳入的 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 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
引言: 請參考以下的連結 >>< 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 發送簡訊給我 |
引言: 該鏈結中的重點 不仍是如前幾篇所述的兩個重點?? SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE); SetForegroundWindow(Application->MainForm->Handle); 對了對了,從上次發表問題經過了這一個多月 發覺使用這兩個 API 仍有凸槌的時候 也就是經過了一個多月後, Focus 又跑不回來了 把程式放到另一台電腦又正常 不知是否跟電腦環境參數變化有關bruce0211 你好: 如果你有仔細看那篇連結文章,會發現仍然有一些差異存在的 我建立這個連結的目的~~只是希望以後如果有人遇到類似問題的話 能夠依照不同的需求,選擇適合的解決方式 --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
chenyuzhi_2000
一般會員 發表:0 回覆:1 積分:0 註冊:2003-06-11 發送簡訊給我 |
|
bundur
一般會員 發表:16 回覆:44 積分:22 註冊:2002-11-30 發送簡訊給我 |
引言: //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 發送簡訊給我 |
一個非正規, 但是可行的方法, 你參考看看吧!!
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 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
|
erin_wang
一般會員 發表:0 回覆:1 積分:0 註冊:2003-09-15 發送簡訊給我 |
我在 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 發送簡訊給我 |
綜合以上的方法,以下內容是我在 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 發送簡訊給我 |
|
dky
一般會員 發表:12 回覆:30 積分:13 註冊:2004-06-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |