[原创]Delphi使程序的窗口出现在最前面并激活

上一篇 / 下一篇  2008-03-08 15:30:25 / 个人分类:Delphi程序设计

在写程序的时候经常碰到这样的需求,如何使处于后台的程序出现在最前面并得到输入焦点?ITPUB个人空间!_g,ilQvc2JjO0x
我在网上搜索了很多次,大致搜到的答案如下:ITPUB个人空间|*@ l.I_
一、最小化的恢复最小化
IWfEY0if (IsIconic(Handle)) thenITPUB个人空间1J%K\oyv
  ShowWindow(Hanlde, SW_RESTORE)ITPUB个人空间;mt^lC:A3r
二、使用BringToFrontITPUB个人空间;um(S.o#b%@)l
 三、使用SetWindowPosITPUB个人空间0EGm J _5{-]8yiPv

9OZ}NIRI i}0第一种方法有一个问题,恢复窗口后不能再次最小化。
1d6G n M@@&c0第二种在XP下使用时只能使得任务栏标题闪烁ITPUB个人空间.id)_mg
第三种方法不能使得窗口激活,也就是不能得到输入焦点
~P z ?h/| r0
"Z)x u `]'V0常用的方法是 第一种 + 第三种, 当然还是有上述的问题。ITPUB个人空间oLhB D)r
我试图找到一个简单的方法,但是最终失败了。于是只好使用了一个笨办法来解决这个问题,实际上就是在第一种 + 第三种 方法的基础上做了一点点修改。
-B e*_!x[C1c0
,?r{*maE ]4d0示例代码如下:ITPUB个人空间N0Fpt7A lId
//判断Application是否最小化,而不是主窗口的Handle, 使用Restore来还原
^vc@n!c6mM7}0if (IsIconic(Application.Handle)) then
s9NS/t'g(u0    Application.Restore;
(Fji_g0  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
_dbU`0|#D&^0  SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);ITPUB个人空间\*[Y,L G^.}v
//保存鼠标位置,模拟点击窗口,然后再还原鼠标位置ITPUB个人空间[/b7p L#L*U@J
  GetCursorPos(OldPt);ITPUB个人空间 HjU4ahaTZ\ R
  NewPt := Point(0, 0);ITPUB个人空间Vd ORpTf ?+w
  Windows.ClientToScreen(Handle, NewPt);
u @E zE0  SetCursorPos(NewPt.X, NewPt.Y);
:W w%[f\PG0  mouse_event(MOUSEEVENTF_LEFTDOWN, NewPt.X, NewPt.Y, 0, 0);ITPUB个人空间#f+O`M k
  mouse_event(MOUSEEVENTF_LEFTUP, NewPt.X, NewPt.Y, 0, 0);ITPUB个人空间(i&s _0n9y7|
  SetCursorPos(OldPt.X, OldPt.Y);ITPUB个人空间}'|_,h)jQ|N3T z$\u

Z6RJF?`T1dE0

TAG:

引用 删除 老梁   /   2008-07-07 18:20:42

SetForegroundWindow(myForm.handle);
SetActiveWindow(myForm.handle);
会更好.
引用 删除 deo   /   2008-04-14 20:52:16
多谢呀,搞了一个下午,都没搞出来。

看了你的文章,原来这样也可以。。呵呵

TKS
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-16  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 2171
  • 日志数: 25
  • 文件数: 1
  • 建立时间: 2008-01-17
  • 更新时间: 2008-09-26

RSS订阅

Open Toolbar