1

カスタム レコードを使用し、レコードの配列を作成してからそのレコードへのポインターを作成するポインターに頭を悩ませることはできません。具体的には、特定のクラス名を持つ各トップ レベル ウィンドウ ハンドルのレコードを作成することです。 1つ以上、EnumChildWindowinで子ウィンドウへのハンドルを取得するために使用するウィンドウごとに。これらのそれぞれを記録して、タイトル付きのコンボボックスに渡し、記録をそのアイテムのオブジェクトにして、記録されたそれぞれにアクセスできるようにしたかった後でそれを選択します。

私の問題はポインターの処理です。配列レコードのいずれかに追加する最初のインスタンスでアクセスが拒否され続けます。

ここで休憩

Param[Form1.iEnumWin].MainHwnd:= aHwnd;

ここに私が使用している完全なコードを示します。これにより、人々は私がやろうとしていることをよりよく理解できるようになります。

implementation

{$R *.dfm}
type
  TMyEnumParam = record
   sTitle: String;
   MainHwnd: Hwnd;
   InTxtHwnd: Hwnd;
   OutTxtHwnd: Hwnd;
   NickListHwnd: Hwnd;
end;
 PMyEnumParam = ^TMyEnumParam;

 type
 ATMyEnumParam = Array[0..9] of PMyEnumParam;
 PATMyEnumParam = ^ATMyEnumParam;

{ Get the window Title based on Hwnd }
function GetWindowTitle(HWND: HWND): string;
begin
  SetLength(Result, 255);
  SetLength(Result, GetWindowText(HWND, PChar(Result), 255));
end;

{ Get the Classname based on Hwnd }
function GetWindowClass(HWND: HWND): string;
begin
  SetLength(Result, 255);
  SetLength(Result, GetClassName(HWND, PChar(Result), 255));
end;

{ EnumChildWidows Callback Add to our records }
Function EnumChildProc(aHwnd: Hwnd; Param: PMyEnumParam): Boolean; stdcall;
begin
     if ((GetDlgCtrlID(aHwnd) = 202) and (isWindowVisible(aHwnd) = True)) then
      Param.InTxtHwnd:= aHwnd;

     if ((GetDlgCtrlID(aHwnd) = 203) and (isWindowVisible(aHwnd) = True)) then
       Param.OutTxtHwnd:= aHwnd;

     if ((GetDlgCtrlID(aHwnd) = 1789) and (isWindowVisible(aHwnd) = True)) then
      Param.NickListHwnd:= aHwnd;

      Result:= True;
end;

{ EnumWindow fill our array of records for each window }
function EnumWindowsProc(aHwnd: HWND; Param: PATMyEnumParam): BOOL; stdcall;
begin
  Result := True;
  if GetWindowClass(aHwnd) = 'DlgGroupChat Window Class' then
  begin
   Param[Form1.iEnumWin].MainHwnd:= aHwnd;
   Param[Form1.iEnumWin].sTitle:=  GetWindowTitle(aHwnd);
   EnumChildWindows(aHwnd, @EnumChildProc, LParam(@Param[Form1.iEnumWin]));
   Form1.cbbRooms.AddItem(Param[Form1.iEnumWin].sTitle, TObject(Param[form1.iEnumWin]));
   inc(Form1.iEnumWin);
  end;
end;

{ On change display room Title for each item }
procedure TForm1.cbbRoomsChange(Sender: TObject);
var
  i: Integer;
  aHwnd: PMyEnumParam;
begin
  i := cbbRooms.ItemIndex;
  if cbbRooms.ItemIndex <> -1 then
  begin
    aHwnd:=  PMyEnumParam(cbbRooms.Items.Objects[i]);
    if aHwnd.MainHwnd > 0 then
    begin
     ShowMessage(aHwnd.sTitle);
    end;
  end;

end;

{ Call EnumWindows and fill our array records }
procedure TForm1.FormCreate(Sender: TObject);
var
 arInfo: PATMyEnumParam;
begin
  iEnumWin:= 0;
  EnumWindows(@EnumWindowsProc, LParam(@arInfo));
end;

誰かが私を正しい方向に向けることができれば(しゃれは意図していません)、感謝します。

4

1 に答える 1