在写程序的时候经常碰到这样的需求,如何使处于后台的程序出现在最前面并得到输入焦点?
ITPUB个人空间!_g,ilQvc2JjO0x我在网上搜索了很多次,大致搜到的答案如下:
ITPUB个人空间|*@ l.I_一、最小化的恢复最小化
IWf EY0if (IsIconic(Handle)) then
ITPUB个人空间1J%K\oyv ShowWindow(Hanlde, SW_RESTORE)
ITPUB个人空间;mt^lC:A3r二、使用BringToFront
ITPUB个人空间;um(S.o#b%@)l 三、使用SetWindowPos
ITPUB个人空间0EGmJ _5{-]8yiPv9OZ}N IRI i}0第一种方法有一个问题,恢复窗口后不能再次最小化。
1d6G n
M@@&c0第二种在XP下使用时只能使得任务栏标题闪烁
ITPUB个人空间.id)_mg第三种方法不能使得窗口激活,也就是不能得到输入焦点
~P
z?h/|r0"Z)x
u`]'V0常用的方法是 第一种 + 第三种, 当然还是有上述的问题。
ITPUB个人空间oLhB D)r我试图找到一个简单的方法,但是最终失败了。于是只好使用了一个笨办法来解决这个问题,实际上就是在第一种 + 第三种 方法的基础上做了一点点修改。
-Be*_!x[C1c0,?r{*maE]4d0示例代码如下:
ITPUB个人空间N0Fpt7AlId//判断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
O RpTf?+w Windows.ClientToScreen(Handle, NewPt);
u @E
zE0 SetCursorPos(NewPt.X, NewPt.Y);
:Ww%[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|N3Tz$\uZ6RJF?`T1dE0