6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 Dialogs, ComCtrls, ImgList, ToolWin, ActnList,
8 SakuraSeekerInstance, DirectSstp, Menus, Clipbrd;
11 TfrmFMOExplorer = class(TForm)
14 ImageList: TImageList;
15 tbtnRestoreSurface: TToolButton;
16 ToolButton2: TToolButton;
17 tbtnKillFMO: TToolButton;
18 tbtnRefresh: TToolButton;
19 ActionList: TActionList;
21 actRestoreSurface: TAction;
23 StatusBar: TStatusBar;
24 DirectSstp: TDirectSstp;
25 PopupMenu: TPopupMenu;
27 mnRestoreSurface: TMenuItem;
28 ToolButton1: TToolButton;
29 tbtnCopyInformation: TToolButton;
30 actCopyInformation: TAction;
31 mnSeparator: TMenuItem;
32 mnCopyInformation: TMenuItem;
33 procedure FormShow(Sender: TObject);
34 procedure actRefreshExecute(Sender: TObject);
35 procedure lvwListChange(Sender: TObject; Item: TListItem;
37 procedure actKillFMOExecute(Sender: TObject);
38 procedure lvwListDblClick(Sender: TObject);
39 procedure actCopyInformationExecute(Sender: TObject);
48 frmFMOExplorer: TfrmFMOExplorer;
58 procedure TfrmFMOExplorer.FormShow(Sender: TObject);
63 procedure TfrmFMOExplorer.UpdateList;
66 HwndToVer, TmpStr: TStringList;
70 SakuraSeeker.BeginDetect;
71 lvwList.Items.BeginUpdate;
72 for i := 0 to SakuraSeeker.Count-1 do begin
73 with lvwList.Items.Add do begin
74 Caption := SakuraSeeker[i].SetName;
75 SubItems.Add(SakuraSeeker[i].FMOName);
76 SubItems.Add(SakuraSeeker[i].ProcessID);
77 SubItems.Add(IntToStr(SakuraSeeker[i].HWnd));
81 valid := (SakuraSeeker[i].Hwnd <> 0) and (SakuraSeeker[i].Name <> '')
82 and (SakuraSeeker[i].KeroName <> '');
84 ImageIndex := IconFMOEntry
86 ImageIndex := IconBrokenFMO;
87 SubItems[4] := '
\94j
\91¹FMO';
90 lvwList.Items.EndUpdate;
91 StatusBar.Panels[0].Text := Format('%d
\8c\8f', [SakuraSeeker.Count]);
93 HwndToVer := TStringList.Create;
96 for i := 0 to SakuraSeeker.Count-1 do begin
97 s := HwndToVer.Values[IntToStr(SakuraSeeker[i].HWnd)];
99 lvwList.Items[i].SubItems[3] := s;
100 lvwList.Items[i].SubItems[4] := '
\90³
\8fí';
102 DirectSSTP.TargetHWnd := SakuraSeeker[i].HWnd;
103 s := DirectSSTP.SstpEXECUTE('GetVersion');
104 TmpStr := TStringList.Create;
107 for j := 0 to TmpStr.Count-1 do
108 if TmpStr[j] <> '' then begin
115 if s <> '' then begin
116 HwndToVer.Values[IntToStr(SakuraSeeker[i].HWnd)] := s;
117 lvwList.Items[i].SubItems[3] := s;
118 lvwList.Items[i].SubItems[4] := '
\90³
\8fí';
120 lvwList.Items[i].SubItems[4] := '
\89\9e\93\9a\82È
\82µ';
121 lvwList.Items[i].ImageIndex := IconBrokenFMO;
130 procedure TfrmFMOExplorer.actRefreshExecute(Sender: TObject);
135 procedure TfrmFMOExplorer.lvwListChange(Sender: TObject; Item: TListItem;
136 Change: TItemChange);
138 if Change <> ctState then Exit;
139 actKillFMO.Enabled := lvwList.Selected <> nil;
140 actCopyInformation.Enabled := lvwList.Selected <> nil;
143 procedure TfrmFMOExplorer.actKillFMOExecute(Sender: TObject);
146 if lvwList.Selected = nil then Exit;
147 for i := lvwList.Items.Count-1 downto 0 do
148 if lvwList.Items[i].Selected and (SakuraSeeker.Process[i] <> nil) then begin
149 SakuraSeeker.KillFMO(SakuraSeeker.Process[i].FMOName, SakuraSeeker.Process[i].ProcessID);
150 lvwList.Items.Delete(i);
154 procedure TfrmFMOExplorer.lvwListDblClick(Sender: TObject);
155 var i, index: integer;
158 if lvwList.Selected = nil then Exit;
159 index := lvwList.Selected.Index;
160 for i := 0 to SakuraSeeker[index].Count-1 do begin
161 if i > 0 then str := str + #13#10;
162 str := str + SakuraSeeker[index].KeyAt[i] + ': ' + SakuraSeeker[index].DataAt[i];
167 procedure TfrmFMOExplorer.actCopyInformationExecute(Sender: TObject);
173 if lvwList.Selected = nil then
175 index := lvwList.Selected.Index;
176 for i := 0 to SakuraSeeker[index].Count-1 do
178 if i > 0 then str := str + #13#10;
179 str := str + SakuraSeeker[index].KeyAt[i] + ': ' + SakuraSeeker[index].DataAt[i];
182 Clip.SetTextBuf(PChar(str));
187 frmFMOExplorer := nil;