used: Boolean; //Π‘Π»ΡΠΆΠ΅Π±Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
end;
ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΠ²Π° styles Ρ ΡΠ°Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΎΠΊΠΎΠ½Π½ΠΎΠΌ ΡΡΠΈΠ»Π΅. ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°, ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΡΡΡΡΠΊΡΡΡΡ Stylelnfo ΠΈ ΠΏΡΠΎΡΠΈΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ Π² ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ , Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ WindowData, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ Π½Π° Π΄ΠΈΡΠΊΠ΅ Π² ΠΏΠ°ΠΏΠΊΠ΅ Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ Π³Π»Π°Π²Ρ.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° styles (ΡΠ»Π°Π³ΠΈ ΡΡΠΈΠ»Ρ, ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠ΅ΠΉ Π΄ΡΡΠ³ΠΈΡ ΡΠ»Π°Π³ΠΎΠ², Π² ΠΌΠ°ΡΡΠΈΠ² Π½Π΅ ΠΏΠΎΠΏΠ°Π»ΠΈ) (Π»ΠΈΡΡΠΈΠ½Π³ 10.7).
...ΠΠΈΡΡΠΈΠ½Π³ 10.7.
ΠΠ°ΡΡΠΈΠ² Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎΠ± ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠΈΠ»ΡΡ
styles: array [0..17] of StyleInfo =
(
(value: WS_BORDER; name: \'WS_BORDER\'),
(value: WS_CAPTION; name: \'WS_CAPTION\'),
(value: WS_CHILD; name: \'WS_CHILD\'),
(value: WS_CLIPCHILDREN; name: \'WS_CLIPCHILDREN\'),
(value: WS_DISABLED; name: \'WS_DISABLED\'),
(value: WS_DLGFRAME; name: \'WS_DLGFRAME\'),
(value: WS_HSCROLL; name: \'WS_HSCROLL\'),
(value: WS_MAXIMIZE; name: \'WS_MAXIMIZE\'),
(value: WS_MAXIMIZEBOX; name: \'WS_MAXIMIZEBOX\'),
(value: WS_MINIMIZE; name: \'WS_MINIMIZE\'),
(value: WS_MINIMIZEBOX; name: \'WS_MINIMIZEBOX\'),
(value: WS_OVERLAPPED; name: \'WS_OVERLAPPED\'),
(value: WS_POPUP; name: \'WS_POPUP\'),
(value: WS_SYSMENU; name: \'WS_SYSMENU\'),
(value: WS_TABSTOP; name: \'WS_TABSTOP\'),
(value: WS_THICKFRAME; name: \'WS_THICKFRAME\'),
(value: WS_VISIBLE; name: \'WS_VISIBLE\'),
(value: WS_VSCROLL; name: \'WS_VSCROLL\')
);
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° LoadWindowExStyle ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° LoadWindowStyle. Π’ΠΎΠ»ΡΠΊΠΎ ΠΎΠ½Π° Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅Ρ cnncKHlstExStyle HlstAvailExStyle ΠΈ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ ΠΌΠ°ΡΡΠΈΠ²Ρ exstyles, Π° Π½Π΅ styles. ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° exstyles (Π»ΠΈΡΡΠΈΠ½Π³ 10.8).
...ΠΠΈΡΡΠΈΠ½Π³ 10.8.
ΠΠ°ΡΡΠΈΠ² Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠΈΠ»ΡΡ
exstyles: array [0..18] of StyleInfo =
(
(value: WS_EX_ACCEPTFILES; name: \'WS_EX_ACCEPTFILES\'),
(value: WS_EX_APPWINDOW; name: \'WS_EX_APPWINDOW\'),
(value: WS_EX_CLIENTEDGE; name: \'WS_EX_CLIENTEDGE\'),
(value: WS_EX_CONTEXTHELP; name: \'WS_EX_CONTEXTHELP\'),
(value: WS_EX_CONTROLPARENT; name: \'WS_EX_CONTROLPARENT\'),
(value: WS_EX_DLGMODALFRAME; name: \'WS_EX_DLGMODALFRAME\'),
(value: WS_EX_LAYERED; name: \'WS_EX_LAYERED\'),
(value: WS_EX_LEFT; name: \'WS_EX_LEFT\'),
(value: WS_EX_LEFTSCROLLBAR; name: \'WS_EX_LEFTSCROLLBAR\'),
(value: WS_EX_MDICHILD; name: \'WS_EX_MDICHILD\'),
(value: WS_EX_NOACTIVATE; name: \'WS_EX_NOACTIVATE\'),
(value: WS_EX_NOINHERITLAYOUT; name: \'WS_EX_NOINHERITLAYOUT\'),
(value: WS_EX_NOPARENTNOTIFY; name: \'WS_EX_NOPARENTNOTIFY\'),
(value: WS_EX_RIGHTSCROLLBAR; name: \'WS_EX_RIGHTSCROLLBAR\'),
(value: WS_EX_STATICEDGE; name: \'WS_EX_STATICEDGE\'),
(value: WS_EX_TOOLWINDOW; name: \'WS_EX_TOOLWINDOW\'),
(value: WS_EX_TOPMOST; name: \'WS_EX_TOPMOST\'),
(value: WS_EX_TRANSPARENT; name: \'WS_EX_TRANSPARENT\'),
(value: WS_EX_WINDOWEDGE; name: \'WS_EX_WINDOWEDGE\')
);
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠΈΠ»Π΅ΠΉ
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠΈΠ»Π΅ΠΉ ΠΎΠΊΠ½Π° Β«Π½Π° Π»Π΅ΡΡΒ» ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Π½Π΅ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΡΠ΅ΠΌ ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅: Ρ ΠΏΠΎΠΌΠΎΡΡΡ API-ΡΡΠ½ΠΊΡΠΈΠΉ GetWindowLong ΠΈ SetWindowsLong. ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ»Π°Π³Π°, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²ΡΠ±ΡΠ°Π½ΠΎ Π² ΡΠΏΠΈΡΠΊΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΡΠΈΠ»Π΅ΠΉ, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.9.
...ΠΠΈΡΡΠΈΠ½Π³ 10.9.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ
procedure TfrmWindowProp.cmbAddStyleClick(Sender: TObject);
var
style: DWORD;
addstyle: DWORD;
begin
if lstAvailStyle.ItemIndex = β1 then Exit;
//Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ ΠΎΠΊΠ½Π°
//..ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΡΡΠΈΠ»Ρ ΡΠ΄Π°Π»ΠΈΡΡ
addstyle := styles[GetStyleIndex(lstAvailStyle.ItemIndex,
False)].value;
//..Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΈΠ»Ρ ΠΎΠΊΠ½Π°
style := GetWindowLong(wnd, GWL_STYLE);
style := style or addstyle;
SetWindowLong(wnd, GWL_STYLE, style);
//..ΠΏΠ΅ΡΠ΅ΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ ΠΎΠΊΠ½Π°
InvalidateRect(0, nil, True);
//ΠΠ±Π½ΠΎΠ²ΠΈΠΌ ΡΠΏΠΈΡΠΎΠΊ ΡΡΠΈΠ»Π΅ΠΉ ΠΎΠΊΠ½Π°
LoadWindowStyle();
end;
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π°Π³Π° ΡΡΠΈΠ»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ, ΠΏΡΠΎΡΡΠΎ Π½Π°Π΄ Π±ΠΈΡΠ°ΠΌΠΈ ΡΡΠΈΠ»Ρ ΠΎΠΊΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄ΡΡΠ³Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ (Π»ΠΈΡΡΠΈΠ½Π³ 10.10).
...ΠΠΈΡΡΠΈΠ½Π³ 10.10.
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ
procedure TfrmWindowProp.cmbDelStyleClick(Sender: TObject);
var
style: DWORD;
delstyle: DWORD;
begin
if lstStyle.ItemIndex = β1 then Exit;
//Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ ΠΎΠΊΠ½Π°
//..ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΡΡΠΈΠ»Ρ ΡΠ΄Π°Π»ΠΈΡΡ
delstyle := styles[GetStyleIndex(lstStyle.ItemIndex, True)].value;
//..Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΈΠ»Ρ ΠΎΠΊΠ½Π°
style := GetWindowLong(wnd, GWL_STYLE);
style := style and not delstyle;
SetWindowLong(wnd, GWL_STYLE, style);
//..ΠΏΠ΅ΡΠ΅ΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ ΠΎΠΊΠ½Π°
InvalidateRect(0, nil, True);
//ΠΠ±Π½ΠΎΠ²ΠΈΠΌ ΡΠΏΠΈΡΠΎΠΊ ΡΡΠΈΠ»Π΅ΠΉ ΠΎΠΊΠ½Π°
LoadWindowStyle();
end;
ΠΠΎΡΠ»Π΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠ° Π²ΡΠ΅Ρ ΠΎΠΊΠΎΠ½, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ²ΠΈΠ»ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ (ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΡ ) ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠΈΠ»Π΅ΠΉ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ. Π’ΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΌΠ°ΡΡΠΈΠ² exstyles, ΡΡΠ½ΠΊΡΠΈΡ GetExStylelndex ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° GWL_EXSTYLE, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠ°Ρ Π² ΡΡΠ½ΠΊΡΠΈΠΈ GetWindowLongΠΈ SetWindowLong.
Π§ΡΠΎ ΠΆΠ΅ Π·Π° ΡΡΠ½ΠΊΡΠΈΡ GetStylelndex ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.10? ΠΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ styles ΡΡΠΈΠ»Ρ, Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ Π² ΡΠΏΠΈΡΠΊΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠΈΠ»Π΅ΠΉ (Π²Π΅ΡΡ Π½ΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ) (Π»ΠΈΡΡΠΈΠ½Π³ 10.11).
...ΠΠΈΡΡΠΈΠ½Π³ 10.11.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ ΠΎ Π½ΡΠΆΠ½ΠΎΠΌ ΡΡΠΈΠ»Π΅
function TfrmWindowProp.GetStyleIndex(listIndex: Integer;
used: Boolean): Integer;
var
i, count: Integer;
begin
count := 0;
for i := 0 to 17 do
if styles[i].used = used then
begin
if count = listIndex then
begin
//ΠΠ°ΡΠ»ΠΈ
GetStyleIndex := i;
Exit;
end;
Inc(count);
end;
GetStyleIndex := 0;
end;
Π€ΡΠ½ΠΊΡΠΈΡ GetStylelndex ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π½ΠΎΠΌΠ΅Ρ ΡΡΡΠΎΠΊΠΈ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΠΈ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΎΡ ΠΈΡΡΠΈΠ½Π½ΠΎΡΡΠΈ ΠΈΠ»ΠΈ Π»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π·Π°Π²ΠΈΡΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠ»ΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΡΠΈΠ»ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ GetStylelndex ΠΈ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡΡΡΠΊΡΡΡΡ Styleinf ΠΎ ΠΏΠΎΠ»Ρ used Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ ΡΡΠΈΠ»Π΅ΠΉ, Π½ΠΎ Π·Π°ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΡΠΈΠ»Π΅ΠΉ Π² ΠΌΠ°ΡΡΠΈΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠΈΠ»Π΅ΠΉ. Π ΡΠΎΠΌΡ ΠΆΠ΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎ Π΄Π²Π° ΠΌΠ°ΡΡΠΈΠ²Π° Π΄Π»Ρ ΠΎΠ±ΡΡΠ½ΡΡ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠΈΠ»Π΅ΠΉ.
ΠΠ΅ΡΠ΅Ρ Π²Π°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°ΠΌΡΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΎΡΠ²Π΅ΡΠ°ΡΡΡΡ Π·Π° ΠΏΠ΅ΡΠ΅Ρ Π²Π°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Π€ΠΎΡΠΌΠ°, Π²Π΅Π΄ΡΡΠ°Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π½Π° ΡΠΈΡ. 10.5.
ΠΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ Π½Π° ΡΠΈΡ. 10.5 ΡΠΎΡΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ ΠΈΠΌΡ frmMessages.
ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ: ΡΠ°ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (ΠΠ₯Π), ΠΎΡΠ²Π΅ΡΠ°ΡΡΠ΅ΠΉ Π·Π° ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΡΠΈΠ»ΡΡΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΈ Π»ΠΎΠ²ΡΡΠΊΠΈ, Π·Π°ΠΊΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ Π² DLL(hook\hook.dll).
ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π»ΠΎΠ²ΡΡΠΊΠΈ ΠΈ ΠΠ₯Π-ΡΠ°ΠΉΠ»Π° ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΎ ΠΏΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡ Π΅ΠΌΠ΅.
1. ΠΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π»ΠΎΠ²ΡΡΠΊΠΈ (ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π² DLL).
2. ΠΡΠΈ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ-Π»ΠΎΠ²ΡΡΠΊΠ° ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΠΎΠΊΠ½Ρ (ΡΠΎΡΠΌΠ΅) frmMessages ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ WM_SPY_NOTIFY (ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, ΡΠΎΡΠ½Π΅Π΅, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, Π»ΠΈΡΡΠΈΠ½Π³ 10.12).
Π ΠΈΡ. 10.5. Π€ΠΎΡΠΌΠ° ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
ΠΠΎ Π²Π΅Π΄Ρ Π»ΠΎΠ²ΡΡΠΊΠ° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅, Π° Π΅ΡΠ»ΠΈ ΡΠ°ΠΊ, ΡΠΎ ΠΊΠ°ΠΊ Π΅ΠΉ Π΄Π°ΡΡ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠΌΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠΊΠ½Ρ ΠΏΠΎΡΡΠ»Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ? ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ Π»ΠΎΠ²ΡΡΠΊΠΈ. Π ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° Π»ΠΎΠ²ΡΡΠΊΠ° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½Π½ΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ (ΠΊΠΎΠ΄ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ). ΠΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π²Π΅Π΄ΡΡΠΈΠΌ ΡΠ»Π΅ΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°Π½Π½ΡΠ΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° Ρ ΡΠ°Π½ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ Π·Π°ΠΏΠΈΡΠΈ THooklnfo, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΠΎΠΉ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ HookData. Π ΡΡΠΎΠΌ ΠΆΠ΅ ΠΌΠΎΠ΄ΡΠ»Π΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_SPY_NOTIFY (Π»ΠΈΡΡΠΈΠ½Π³ 10.12) ΠΈ Π΄Π²Π΅ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠ½Π΅Π½ΠΎ Π΄Π°Π»Π΅Π΅.
...ΠΠΈΡΡΠΈΠ½Π³ 10.12.
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π° HookData.pas
type
//Π‘ΡΡΡΠΊΡΡΡΠ° (Π·Π°ΠΏΠΈΡΡ), ΠΊΠΎΡΠΎΡΠ°Ρ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΌ ΡΠ°ΠΉΠ»Π΅
//ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ
THookInfo = record
wnd: HWND; //ΠΠΊΠ½ΠΎ, Π·Π° ΠΊΠΎΡΠΎΡΡΠΌ Π²Π΅Π΄Π΅ΡΡΡ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅
hook_handle: HHOOK; //ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π»ΠΎΠ²ΡΡΠΊΠΈ
spy_wnd: HWND; //ΠΠΊΠ½ΠΎ, ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ΅ΠΌΠΎΠ΅ ΠΎ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
//Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠΎΠ»Ρ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
mess: UINT;
wParam: WPARAM;
lParam: LPARAM;
end;
var
//Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ
hook_info: ^THookInfo;
//ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ
hFile: THandle;
const
//ΠΠΌΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ ΡΠ°ΠΉΠ»Π°
strFileMapName = \'TricksDelphi_WinSpy_Mapping\
//Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎΠΊΠ½Π°-ΡΠΏΠΈΠΎΠ½Π°
WM_SPY_NOTIFY = WM_USER + 1;
ΠΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΡΠΈΠ»ΡΡΡΠ° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
Π’Π΅ΠΏΠ΅ΡΡ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ-ΡΠΏΠΈΠΎΠ½Ρ, Π° ΡΠΎΡΠ½Π΅Π΅, ΠΊ ΡΠΎΠΉ Π΅Π³ΠΎ ΡΠ°ΡΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠ°Π±ΠΎΡΡ ΡΠΎΡΠΌΡ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π½Π° ΡΠΈΡ. 10.5.
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ β ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΈΠ»ΡΡΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΠ½ ΠΏΠΎΡΡΡΠΎΠ΅Π½ ΠΏΠΎ ΡΠΎΠΌΡ ΠΆΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ, ΡΡΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠΈΠ»Π΅ΠΉ (ΡΠΎΡΠΌΠ° ΡΠ²ΠΎΠΉΡΡΠ² ΠΎΠΊΠ½Π°, ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½Π°Ρ ΡΠ°Π½Π΅Π΅).
ΠΡΠ°ΠΊ, ΡΡΡΡΠΊΡΡΡΠ°, Ρ ΡΠ°Π½ΡΡΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ, Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
...type MessageInfo = record
value: DWORD; //ΠΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
name: String; //ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
used: Boolean; //Π‘Π»ΡΠΆΠ΅Π±Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
end;
ΠΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ ΡΡΠΎΡΠ»Π° ΡΠ΅Π»Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² ΡΠΈΠ»ΡΡΡ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ°ΡΡΠΈΠ² messageslist (Π»ΠΈΡΡΠΈΠ½Π³ 10.13) ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ 16 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΡΠΆΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, Π²Π·ΡΠ² ΠΈΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Windows.
...ΠΠΈΡΡΠΈΠ½Π³ 10.13.
Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ
const
mess_first = 0;
mess_last = 15;
var
messages_list: array [mess_first..mess_last] of MessageInfo =
(
(value: WM_DESTROY; name: \'WM_DESTROY\ used: False),
(value: WM_MOVE; name: \'WM_MOVE\ used: False),
(value: WM_SIZE; name: \'WM_SIZE\ used: False),
(value: WM_ACTIVATE; name: \'WM_ACTIVATE\ used: False),
(value: WM_SETFOCUS; name: \'WM_SETFOCUS\ used: False),
(value: WM_KILLFOCUS; name: \'WM_KILLFOCUS\ used: False),
(value: WM_ENABLE; name: \'WM_ENABLE\ used: False),
(value: WM_SETTEXT; name: \'WM_SETTEXT\ used: False),
(value: WM_GETTEXT; name: \'WM_GETTEXT\ used: False),
(value: WM_PAINT; name: \'WM_PAINT\ used: False),
(value: WM_CLOSE; name: \'WM_CLOSE\ used: False),
(value: WM_QUIT; name: \'WM_QUIT\ used: False),
(value: WM_SIZING; name: \'WM_SIZING\ used: False),
(value: WM_MOVING; name: \'WM_MOVING\ used: False),
(value: WM_NOTIFY; name: \'WM_NOTIFY\ used: False),
(value: WM_NCHITTEST; name: \'WM_NCHITTEST\ used: False)
);
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠΈΠ»ΡΡΡΠ° (Π²ΡΠ±ΡΠ°Π½Π½ΡΡ ΠΈ Π½Π΅Π²ΡΠ±ΡΠ°Π½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠΏΠΈΡΠΊΠΈ) ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ (Π»ΠΈΡΡΠΈΠ½Π³ 10.14).