GetForegroundWindow 与 GetActiveWindow 的区别 - 回复 "delphier" 的问题

问题来源: http://www.cnblogs.com/del/archive/2008/12/13/1081644.html#1400835



GetActiveWindow 只是获取当前程序中(严格地说是线程中)被激活的窗口;
GetForegroundWindow 是获取当前系统中被激活的窗口.

两个函数的级别不一样, 一个是线程级、一个是系统级.

被激活的窗口不一定是顶层窗口(最上面的窗口).

下面的例子可以充分说明问题, 测试方法:点击三个按钮,然后反复切换焦点、观察.



代码文件:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  i: Integer;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  buf: array[Byte] of Char;
begin
  GetWindowText(GetActiveWindow, buf, Length(buf)*SizeOf(buf[0]));
  Label1.Caption := 'GetActiveWindow: ' + buf;

  GetWindowText(GetForegroundWindow, buf, Length(buf)*SizeOf(buf[0]));
  Label2.Caption := 'GetForegroundWindow: ' + buf;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TForm1;
begin
  Inc(i);
  frm := TForm1.Create(Self);
  frm.FormStyle := fsNormal;
  frm.Text := Format('Normal %d', [i]);
  frm.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  frm: TForm1;
begin
  Inc(i);
  frm := TForm1.Create(Self);
  frm.FormStyle := fsStayOnTop;
  frm.Text := Format('StayOnTop %d', [i]);
  frm.Show;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  WinExec('notepad.exe', SW_NORMAL);
  WinExec('calc.exe', SW_NORMAL);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 100;
  Button1.Caption := '建立一般窗口';
  Button2.Caption := '建立顶层窗口';
  Button3.Caption := '启动记事本和计算器';
end;

end.