Chameleon/frmResults.pas

184 lines
4.7 KiB
ObjectPascal

unit frmResults;
{$MODE Delphi}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, Menus;
type
TResults = class(TForm)
popListData: TPopupMenu;
Savelistdata1: TMenuItem;
TreeView1: TTreeView;
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
procedure Savelistdata1Click(Sender: TObject);
private
procedure GetWinInfoStyle(wnd: HWND; ParentNode: TTreeNode);
procedure GetWinInfoExtendedStyle(wnd: HWND; ParentNode: TTreeNode);
public
procedure GetWinInfo(wnd: HWND; ParentNode: TTreeNode);
end;
var
Results: TResults;
implementation
uses DfmEngine, StyleNames;
{$R *.lfm}
procedure TResults.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if (Assigned(Node) and (Node.Text = '[List Data]')) then
TreeView1.PopupMenu := popListData
else
TreeView1.PopupMenu := nil;
end;
procedure TResults.Savelistdata1Click(Sender: TObject);
var
f: TextFile;
n: TTreeNode;
i: integer;
function RemoveTag(const s: string): string;
var
pos1: integer;
begin
pos1 := Pos('=', s);
Result := Copy(s, pos1 + 2, Length(s) - pos1 - 1);
end;
begin
AssignFile(f, 'c:\listdata.csv');
Rewrite(f);
n := TreeView1.Selected;
for i := 0 to n.Count - 1 do
begin
WriteLn(f, i, ';', RemoveTag(n.Items[i].Items[0].Text), ';',
RemoveTag(n.Items[i].Items[1].Text));
end;
CloseFile(f);
end;
procedure TResults.GetWinInfo(wnd: HWND; ParentNode: TTreeNode);
var
len, i, cbcount: integer;
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
if not IsWindow(wnd) then
begin
TreeView1.Items.AddChild(ParentNode, 'Handle = (INVALID HANDLE)');
Exit;
end;
childlist := TList.Create;
len := GetWindowTextLength(wnd) + 1;
GetMem(Text, len);
GetWindowText(wnd, Text, len);
GetWindowRect(wnd, R1);
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);
childlist.Free;
end;
procedure TResults.GetWinInfoStyle(wnd: HWND; ParentNode: TTreeNode);
var
style: Integer;
list: TStringList;
node1: TTreeNode;
i: Integer;
begin
style := GetWindowLong(wnd, GWL_STYLE);
list := GetWindowStyleNames(style);
with TreeView1.Items do
begin
node1 := AddChild(ParentNode, 'Style');
AddChild(node1, 'Value = ' + IntToStr(style));
for i := 0 to list.Count - 1 do
AddChild(node1, list[i]);
end;
list.Free();
end;
procedure TResults.GetWinInfoExtendedStyle(wnd: HWND; ParentNode: TTreeNode);
var
style: Integer;
list: TStringList;
node1: TTreeNode;
i: Integer;
begin
style := GetWindowLong(wnd, GWL_EXSTYLE);
list := GetExtendedWindowStyleNames(style);
with TreeView1.Items do
begin
node1 := AddChild(ParentNode, 'Extended Style');
AddChild(node1, 'Value = ' + IntToStr(style));
for i := 0 to list.Count - 1 do
AddChild(node1, list[i]);
end;
list.Free();
end;
end.