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.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 155
  ClientWidth = 250
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 32
    Top = 24
    Width = 281
    Height = 17
    Caption = 'Label1'
  end
  object Label2: TLabel
    Left = 32
    Top = 47
    Width = 281
    Height = 17
    Caption = 'Label2'
  end
  object Button1: TButton
    Left = 24
    Top = 87
    Width = 97
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 136
    Top = 87
    Width = 97
    Height = 25
    Caption = 'Button2'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 24
    Top = 118
    Width = 209
    Height = 25
    Caption = 'Button3'
    TabOrder = 2
    OnClick = Button3Click
  end
  object Timer1: TTimer
    OnTimer = Timer1Timer
    Left = 208
    Top = 56
  end
end

 
 
 
 
 

 

 

  

转载于:https://my.oschina.net/hermer/blog/319945

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值