• 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
    
  • 相关阅读:
    CUBRID学习笔记 44 UPDATE 触发器 更新多表 教程
    解决Tomcat出现内存溢出的问题
    用视图+存储过程解决复杂查询的排序分页问题
    IIS的安装与配置
    UI设计
    2 睡觉
    HTML5的新结构标签
    聚合函数
    Sql Group by 语句
    口语第一课
  • 原文地址:https://www.cnblogs.com/del/p/1354291.html
Copyright © 2020-2023  润新知