Delphi使程序的窗口出現在最前面並激活


在寫程序的時候經常碰到這樣的需求,如何使處於后台的程序出現在最前面並得到輸入焦點?
我在網上搜索了很多次,大致搜到的答案如下:
一、最小化的恢復最小化
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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM