在寫程序的時候經常碰到這樣的需求,如何使處於后台的程序出現在最前面並得到輸入焦點?
我在網上搜索了很多次,大致搜到的答案如下:
一、最小化的恢復最小化
if (IsIconic(Handle)) then
ShowWindow(Hanlde, SW_RESTORE)
二、使用BringToFront
三、使用SetWindowPos
第一種方法有一個問題,恢復窗口后不能再次最小化。
第二種在XP下使用時只能使得任務欄標題閃爍
第三種方法不能使得窗口激活,也就是不能得到輸入焦點
常用的方法是 第一種 + 第三種, 當然還是有上述的問題。
我試圖找到一個簡單的方法,但是最終失敗了。於是只好使用了一個笨辦法來解決這個問題,實際上就是在第一種 + 第三種 方法的基礎上做了一點點修改。
示例代碼如下:
//判斷Application是否最小化,而不是主窗口的Handle, 使用Restore來還原
if (IsIconic(Application.Handle)) then
Application.Restore;
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
//保存鼠標位置,模擬點擊窗口,然后再還原鼠標位置
GetCursorPos(OldPt);
NewPt := Point(0, 0);
Windows.ClientToScreen(Handle, NewPt);
SetCursorPos(NewPt.X, NewPt.Y);
mouse_event(MOUSEEVENTF_LEFTDOWN, NewPt.X, NewPt.Y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, NewPt.X, NewPt.Y, 0, 0);
SetCursorPos(OldPt.X, OldPt.Y);