Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2005年11月20日] [更新 2013年10月27日] Delphi サンプルプログラム集
350_自分自身のスレッドに関連するウィンドウをリスト
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro
350_ThreadList.zip [549 KB] 2013年10月27日版 (EXE 同梱)







01_自分自身のスレッドに関連するウィンドウをリスト


自分自身のスレッドに関連するウィンドウだけをリスト表示する例です.
このサンプルだけでは意味はありせん.開発中のアプリケーションにコードをコピペして利用してみてください.


図1
実行時画面

リスト1
自スレッドのウィンドウをリスト
unit ThreadListUnit;

interface

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

type
  TThreadListForm = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Panel2: TPanel;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  ThreadListForm: TThreadListForm;

implementation

{$R *.DFM}

//-----------------------------------------------------------------------------
//  EnumThreadWindos関数のコールバック関数
//
//  hWindow : ウィンドウのハンドル
//  lPar    : ユーザ定義の値(EnumThreadWindowsの第3引数)
//-----------------------------------------------------------------------------
function EnumThreadWndProc(hWidow: HWND; lPar : TStringList) : Boolean; stdcall;
var
  Buffer : array[0..MAX_PATH - 1] of Char;
begin
  Result := True;

  FillChar(Buffer, SizeOf(Buffer), #0);
  if GetWindowText(hWidow, Buffer, MAX_PATH) > 0 then begin
    lPar.AddObject(Buffer, TObject(hWidow));
  end;
end;

//=============================================================================
//  列挙開始
//=============================================================================
procedure TThreadListForm.Button1Click(Sender: TObject);
var
  SL : TStringList;
  i  : Integer;
begin
  SL := TStringList.Create;
  try
    EnumThreadWindows(GetCurrentThreadId, Addr(EnumThreadWndProc), LPARAM(SL));
    ListBox1.Clear;

    //自分自身を除いたスレッドをリスト表示
    for i := 0 to SL.Count - 1 do begin
      if Cardinal(SL.Objects[i]) <> Self.Handle then begin
        ListBox1.Items.Add(SL[i]);
      end;
    end;
  finally
    FreeAndNil(SL);
  end;
end;

end.




02_使用例


ワード操作フォームEx のテストプログラム,[ReplaceStr] の継承フォームにボタンを追加して,次のコードでテストした結果です.
Form1 は,ワード操作フォームEx を起動するメインフォームです.ウィンドウのタイトルが [文字列操作テスト文書] となっているのが,ワード操作フォームEx の継承フォームで,plWordFormEx が元のワード操作フォームEx のフォームです.


図2
実行画面
  • 以下のファイルをプロジェクトフォルダにコピー
    ThreadListUnit.dfm
    ThreadListUnit.pas
  • uses に ThreadListunit を追加

リスト2
テストコード
procedure TplWordFormEx2.Button3Click(Sender: TObject);
begin
  ThreadListForm := TThreadListForm.Create(Self);
  try
    ThreadListForm.ShowModal;
  finally
    FreeAndNil(ThreadListForm);
  end;
end;