mirror of
https://github.com/ngeor/Chameleon.git
synced 2025-12-19 09:53:43 +01:00
refactor: Break GetWinInfo to small procedures
This commit is contained in:
parent
2ed9211d89
commit
6ba70319e0
@ -26,7 +26,7 @@
|
|||||||
<UseVersionInfo Value="True"/>
|
<UseVersionInfo Value="True"/>
|
||||||
<AutoIncrementBuild Value="True"/>
|
<AutoIncrementBuild Value="True"/>
|
||||||
<MinorVersionNr Value="1"/>
|
<MinorVersionNr Value="1"/>
|
||||||
<BuildNr Value="3"/>
|
<BuildNr Value="4"/>
|
||||||
</VersionInfo>
|
</VersionInfo>
|
||||||
<BuildModes Count="1">
|
<BuildModes Count="1">
|
||||||
<Item1 Name="Default" Default="True"/>
|
<Item1 Name="Default" Default="True"/>
|
||||||
|
|||||||
BIN
Chameleon.res
BIN
Chameleon.res
Binary file not shown.
177
frmResults.pas
177
frmResults.pas
@ -16,8 +16,13 @@ type
|
|||||||
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
|
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
|
||||||
procedure Savelistdata1Click(Sender: TObject);
|
procedure Savelistdata1Click(Sender: TObject);
|
||||||
private
|
private
|
||||||
|
procedure GetWinInfoText(wnd: HWND; ParentNode: TTreeNode);
|
||||||
|
function GetWinInfoClassName(wnd: HWND; ParentNode: TTreeNode): String;
|
||||||
procedure GetWinInfoStyle(wnd: HWND; ParentNode: TTreeNode);
|
procedure GetWinInfoStyle(wnd: HWND; ParentNode: TTreeNode);
|
||||||
procedure GetWinInfoExtendedStyle(wnd: HWND; ParentNode: TTreeNode);
|
procedure GetWinInfoExtendedStyle(wnd: HWND; ParentNode: TTreeNode);
|
||||||
|
procedure GetWinInfoPlacement(wnd: HWND; ParentNode: TTreeNode);
|
||||||
|
procedure GetWinInfoListData(wnd: HWND; ParentNode: TTreeNode);
|
||||||
|
procedure GetWinInfoChildren(wnd: HWND; ParentNode: TTreeNode);
|
||||||
public
|
public
|
||||||
procedure GetWinInfo(wnd: HWND; ParentNode: TTreeNode);
|
procedure GetWinInfo(wnd: HWND; ParentNode: TTreeNode);
|
||||||
end;
|
end;
|
||||||
@ -31,6 +36,18 @@ uses DfmEngine, StyleNames;
|
|||||||
|
|
||||||
{$R *.lfm}
|
{$R *.lfm}
|
||||||
|
|
||||||
|
function GetClassNameAsString(wnd: HWND): String;
|
||||||
|
var
|
||||||
|
class_name: array [0..100] of char;
|
||||||
|
len: Integer;
|
||||||
|
begin
|
||||||
|
len := GetClassName(wnd, class_name, 100);
|
||||||
|
if len > 0 then
|
||||||
|
Result := class_name
|
||||||
|
else
|
||||||
|
Result := '';
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TResults.TreeView1Change(Sender: TObject; Node: TTreeNode);
|
procedure TResults.TreeView1Change(Sender: TObject; Node: TTreeNode);
|
||||||
begin
|
begin
|
||||||
if (Assigned(Node) and (Node.Text = '[List Data]')) then
|
if (Assigned(Node) and (Node.Text = '[List Data]')) then
|
||||||
@ -67,73 +84,44 @@ end;
|
|||||||
|
|
||||||
procedure TResults.GetWinInfo(wnd: HWND; ParentNode: TTreeNode);
|
procedure TResults.GetWinInfo(wnd: HWND; ParentNode: TTreeNode);
|
||||||
var
|
var
|
||||||
len, i, cbcount: integer;
|
class_name: String;
|
||||||
Text: PChar;
|
|
||||||
class_name: array [0..100] of char;
|
|
||||||
R1, R2: TRect;
|
|
||||||
node1, node2: TTreeNode;
|
|
||||||
childlist: TList;
|
|
||||||
EnumParams: TEnumParams;
|
|
||||||
parentWnd: HWND;
|
|
||||||
itemtext: array [0..300] of char;
|
|
||||||
begin
|
begin
|
||||||
if not IsWindow(wnd) then
|
if IsWindow(wnd) then
|
||||||
begin
|
begin
|
||||||
TreeView1.Items.AddChild(ParentNode, 'Handle = (INVALID HANDLE)');
|
TreeView1.Items.AddChild(ParentNode, 'Handle = ' + IntToStr(wnd));
|
||||||
Exit;
|
GetWinInfoText(wnd, ParentNode);
|
||||||
|
class_name := GetWinInfoClassName(wnd, ParentNode);
|
||||||
|
TreeView1.Items.AddChild(ParentNode, 'Parent Handle = ' + IntToStr(GetParent(wnd)));
|
||||||
|
GetWinInfoStyle(wnd, ParentNode);
|
||||||
|
GetWinInfoExtendedStyle(wnd, ParentNode);
|
||||||
|
GetWinInfoPlacement(wnd, ParentNode);
|
||||||
|
{ CompareText for case-insensitive comparison }
|
||||||
|
if CompareText(class_name, 'COMBOBOX') = 0 then
|
||||||
|
begin
|
||||||
|
GetWinInfoListData(wnd, ParentNode);
|
||||||
end;
|
end;
|
||||||
childlist := TList.Create;
|
GetWinInfoChildren(wnd, ParentNode);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
TreeView1.Items.AddChild(ParentNode, 'Handle = (INVALID HANDLE)');
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TResults.GetWinInfoText(wnd: HWND; ParentNode: TTreeNode);
|
||||||
|
var
|
||||||
|
len: integer;
|
||||||
|
Text: PChar;
|
||||||
|
begin
|
||||||
len := GetWindowTextLength(wnd) + 1;
|
len := GetWindowTextLength(wnd) + 1;
|
||||||
GetMem(Text, len);
|
GetMem(Text, len);
|
||||||
GetWindowText(wnd, Text, len);
|
GetWindowText(wnd, Text, len);
|
||||||
GetWindowRect(wnd, R1);
|
TreeView1.Items.AddChild(ParentNode, 'Caption = ' + Text);
|
||||||
Windows.GetClientRect(wnd, R2);
|
|
||||||
GetClassName(wnd, class_name, 100);
|
|
||||||
parentWnd := GetParent(wnd);
|
|
||||||
EnumParams.List := childlist;
|
|
||||||
EnumParams.ParentWnd := wnd;
|
|
||||||
EnumChildWindows(wnd, @EnumChildrenProc, integer(@EnumParams));
|
|
||||||
|
|
||||||
with TreeView1.Items do
|
|
||||||
begin
|
|
||||||
AddChild(ParentNode, 'Handle = ' + IntToStr(wnd));
|
|
||||||
AddChild(ParentNode, 'Caption = ' + Text);
|
|
||||||
AddChild(ParentNode, 'Class name = ' + class_name);
|
|
||||||
AddChild(ParentNode, 'Parent Handle = ' + IntToStr(parentWnd));
|
|
||||||
GetWinInfoStyle(wnd, ParentNode);
|
|
||||||
GetWinInfoExtendedStyle(wnd, ParentNode);
|
|
||||||
node1 := AddChild(ParentNode, 'Placement');
|
|
||||||
AddChild(node1, 'Left = ' + IntToStr(R1.Left));
|
|
||||||
AddChild(node1, 'Top = ' + IntToStr(R1.Top));
|
|
||||||
AddChild(node1, 'Width = ' + IntToStr(R1.Right - R1.Left));
|
|
||||||
AddChild(node1, 'Height = ' + IntToStr(R1.Bottom - R1.Top));
|
|
||||||
AddChild(node1, 'ClientWidth = ' + IntToStr(R2.Right));
|
|
||||||
AddChild(node1, 'ClientHeight = ' + IntToStr(R2.Bottom));
|
|
||||||
if (CompareText(class_name, 'COMBOBOX') = 0) then
|
|
||||||
begin
|
|
||||||
node1 := AddChild(ParentNode, '[List Data]');
|
|
||||||
cbcount := SendMessage(wnd, CB_GETCOUNT, 0, 0);
|
|
||||||
for i := 1 to cbcount do
|
|
||||||
begin
|
|
||||||
SendMessage(wnd, CB_GETLBTEXT, i - 1, longint(@itemtext));
|
|
||||||
node2 := AddChild(node1, 'Item #' + IntToStr(i));
|
|
||||||
AddChild(node2, 'Text = ' + itemtext);
|
|
||||||
AddChild(node2, 'Data = ' +
|
|
||||||
IntToStr(SendMessage(wnd, CB_GETITEMDATA, i - 1, 0)));
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
if childlist.Count > 0 then
|
|
||||||
begin
|
|
||||||
node1 := AddChild(ParentNode, 'Children information');
|
|
||||||
for i := 1 to childlist.Count do
|
|
||||||
begin
|
|
||||||
node2 := AddChild(node1, 'Child #' + IntToStr(i));
|
|
||||||
GetWinInfo(integer(childlist[i - 1]), node2);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
FreeMem(Text);
|
FreeMem(Text);
|
||||||
childlist.Free;
|
end;
|
||||||
|
|
||||||
|
function TResults.GetWinInfoClassName(wnd: HWND; ParentNode: TTreeNode): String;
|
||||||
|
begin
|
||||||
|
Result := GetClassNameAsString(wnd);
|
||||||
|
TreeView1.Items.AddChild(ParentNode, 'Class name = ' + Result);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TResults.GetWinInfoStyle(wnd: HWND; ParentNode: TTreeNode);
|
procedure TResults.GetWinInfoStyle(wnd: HWND; ParentNode: TTreeNode);
|
||||||
@ -180,4 +168,73 @@ begin
|
|||||||
list.Free();
|
list.Free();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TResults.GetWinInfoPlacement(wnd: HWND; ParentNode: TTreeNode);
|
||||||
|
var
|
||||||
|
R1, R2: TRect;
|
||||||
|
node1: TTreeNode;
|
||||||
|
begin
|
||||||
|
GetWindowRect(wnd, R1);
|
||||||
|
Windows.GetClientRect(wnd, R2);
|
||||||
|
with TreeView1.Items do
|
||||||
|
begin
|
||||||
|
node1 := AddChild(ParentNode, 'Placement');
|
||||||
|
AddChild(node1, 'Left = ' + IntToStr(R1.Left));
|
||||||
|
AddChild(node1, 'Top = ' + IntToStr(R1.Top));
|
||||||
|
AddChild(node1, 'Width = ' + IntToStr(R1.Right - R1.Left));
|
||||||
|
AddChild(node1, 'Height = ' + IntToStr(R1.Bottom - R1.Top));
|
||||||
|
AddChild(node1, 'ClientWidth = ' + IntToStr(R2.Right));
|
||||||
|
AddChild(node1, 'ClientHeight = ' + IntToStr(R2.Bottom));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TResults.GetWinInfoListData(wnd: HWND; ParentNode: TTreeNode);
|
||||||
|
var
|
||||||
|
i, cbcount: integer;
|
||||||
|
node1, node2: TTreeNode;
|
||||||
|
itemtext: array [0..300] of char;
|
||||||
|
begin
|
||||||
|
with TreeView1.Items do
|
||||||
|
begin
|
||||||
|
node1 := AddChild(ParentNode, '[List Data]');
|
||||||
|
cbcount := SendMessage(wnd, CB_GETCOUNT, 0, 0);
|
||||||
|
for i := 1 to cbcount do
|
||||||
|
begin
|
||||||
|
SendMessage(wnd, CB_GETLBTEXT, i - 1, longint(@itemtext));
|
||||||
|
node2 := AddChild(node1, 'Item #' + IntToStr(i));
|
||||||
|
AddChild(node2, 'Text = ' + itemtext);
|
||||||
|
AddChild(node2, 'Data = ' +
|
||||||
|
IntToStr(SendMessage(wnd, CB_GETITEMDATA, i - 1, 0)));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TResults.GetWinInfoChildren(wnd: HWND; ParentNode: TTreeNode);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
node1, node2: TTreeNode;
|
||||||
|
childlist: TList;
|
||||||
|
EnumParams: TEnumParams;
|
||||||
|
class_name: String;
|
||||||
|
begin
|
||||||
|
childlist := TList.Create;
|
||||||
|
|
||||||
|
EnumParams.List := childlist;
|
||||||
|
EnumParams.ParentWnd := wnd;
|
||||||
|
EnumChildWindows(wnd, @EnumChildrenProc, integer(@EnumParams));
|
||||||
|
|
||||||
|
with TreeView1.Items do
|
||||||
|
begin
|
||||||
|
if childlist.Count > 0 then
|
||||||
|
begin
|
||||||
|
node1 := AddChild(ParentNode, 'Children information');
|
||||||
|
for i := 1 to childlist.Count do
|
||||||
|
begin
|
||||||
|
node2 := AddChild(node1, 'Child #' + IntToStr(i));
|
||||||
|
GetWinInfo(integer(childlist[i - 1]), node2);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
childlist.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user