ΠΡΠΎΡΠ°Ρ ΠΏΡΠΈΡΠΈΠ½Π° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Windows β ΡΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Ρ Π²ΡΡΠ΅ΡΠ½ΡΡΡΠ΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°ΡΠ½ΠΎΡΡΡΡ, ΠΈ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π΄Π°ΠΆΠ΅ Π½Π° ΠΊΠΎΡΠΎΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π΄Π»Ρ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠ΅ΡΡΡ, Windows ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π²Π½ΠΎΡΡ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ². Π§ΡΠΎΠ±Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΡΡ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΡ Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΠ°, ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΡΠΎΠ² ΠΌΡ Π½Π°Π·Π½Π°ΡΠ°Π΅ΠΌ ΡΠ²ΠΎΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΈ Π΅Π³ΠΎ Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΡΠ»ΠΎ ΡΠΈΡΡΠ°ΡΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΡΡ ΠΊΠ²Π°Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Ρ ΡΠ΅ΡΡΠ°. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ ΡΠ°ΠΊΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅Π»ΡΠ·Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ΅ΠΏΠ΅Π½Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΡΡΠΈ.
Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΡΠ°ΠΌΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΡΠΎ ΠΎΠ½ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠΈΠ»ΡΠ½ΠΎ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°. ΠΠΎ ΠΏΠ΅ΡΠ²ΡΠΌ Π΄Π²ΡΠΌ ΡΠ΅ΡΡΠ°ΠΌ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄Π»Ρ DDB-ΡΠ°ΡΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠ°ΠΊ Π² Π΄Π²Π°-ΡΡΠΈ ΡΠ°Π·Π° ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π΄Π»Ρ DIB, ΡΠ°ΠΊ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ Π΅Π³ΠΎ. Π ΡΡΠ΅ΡΡΠ΅ΠΌ ΡΠ΅ΡΡΠ΅ DIB-ΡΠ°ΡΡΡ, ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΠΏΠ΅ΡΠ΅ΠΆΠ°Π΅Ρ ΠΏΠΎ ΡΠΊΠΎΡΠΎΡΡΠΈ DDB, Ρ ΠΎΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π΄Π΅ΡΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°. Π’Π°ΠΊΠΆΠ΅ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ Π²Π΅ΡΡΠΈΠΈ Delphi, ΠΏΠΎΠ΄ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ΅ΡΡ ΠΈ Π΄Π»Ρ DIB, ΠΈ Π΄Π»Ρ DDB Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΡΡΡΡΠ΅Π΅ ΠΏΠΎΠ΄ Delphi 2007, ΡΠ΅ΠΌ ΠΏΠΎΠ΄ Delphi 5, Π° Π²ΠΎΡ ΡΡΠ΅ΡΠΈΠΉ ΡΠ΅ΡΡ ΠΏΠΎΠ΄ Delphi 2007 Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅.
1.3. ΠΠ±ΠΎΠ±ΡΠ°ΡΡΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ
Π Π°ΡΡΠΌΠΎΡΡΠ΅Π² ΠΎΡΠ½ΠΎΠ²Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ API. ΠΌΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΎΠ±ΠΎΠ±ΡΠ°ΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌ β ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΌ ΡΠ°Π·Π½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° API Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π·Π°ΠΊΠΎΠ½ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°.
1.3.1. ΠΠ±ΠΎΠ±ΡΠ°ΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ 1 β ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°Ρ
ΠΠ΅ΡΠ²ΡΠΌ ΠΎΠ±ΠΎΠ±ΡΠ°ΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΡΠ°Π½Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°Ρ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΎΠ± ΠΎΠΊΠ½Π°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ΠΈ ΠΎΡΠΊΡΡΠ²Π°ΡΡ. ΠΠ° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅, ΠΏΡΠΈΠ»Π°Π³Π°Π΅ΠΌΠΎΠΌ ΠΊ ΠΊΠ½ΠΈΠ³Π΅, ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ProcInfo. ΠΠΊΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ProcInfo ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ 1.13.
Π ΠΈΡ. 1.13. ΠΠΊΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ProcInfo
1.3.1.1. ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
ΠΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ»ΠΎΠΆΠΈΠ»ΠΎΡΡ ΡΠ°ΠΊ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²: Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Tool Help ΠΈ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΉ PSAPI. ΠΡΠΈ Π΄Π²Π΅ Π³ΡΡΠΏΠΏΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ Π² ΡΠ°Π·Π½ΡΡ Π»ΠΈΠ½ΠΈΡΡ Windows: ΡΡΠ½ΠΊΡΠΈΠΈ Tool Help ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π² Windows 95, ΡΡΠ½ΠΊΡΠΈΠΈ PSAPI β Π² Windows NT 4. Windows 2000 XP ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Tool Help, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Windows 98/ME Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ PSAPI. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π²ΡΠ±Π΅ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ Tool Help, ΡΡΠΎ Π΄Π°ΡΡ Π½Π°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΎ Π²ΡΠ΅Ρ Π²Π΅ΡΡΠΈΡΡ Windows, ΠΊΡΠΎΠΌΠ΅ NT 4 (Π²ΠΏΡΠΎΡΠ΅ΠΌ, Π² Windows 95 ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠΆΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π½ΠΎ ΠΏΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅: ΠΈΠ·-Π·Π° ΡΡΠ½ΠΊΡΠΈΠΉ GetWindowInfo ΠΈ RealGetWindowClass, ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΡ Π² ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ). Π€ΡΠ½ΠΊΡΠΈΠΈ Tool Help ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ TlHelp32.
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°ΡΡ "ΡΠ½ΠΈΠΌΠΎΠΊ" ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ CreateToolhelp32Snapshot. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Ρ ΡΠ°Π½ΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°Ρ , ΠΌΠΎΠ΄ΡΠ»ΡΡ , Π½ΠΈΡΡΡ ΠΈ ΠΊΡΡΠ°Ρ , ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ½ΠΈΠΌΠΊΠΎΠΌ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Ρ ΡΠ°Π½ΡΡΠ°ΡΡΡ Π² Π½Π΅ΠΌ, Π°ΠΊΡΡΠ°Π»ΡΠ½Π° Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ CreateToolhelp32Snapshot; Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΠΈ Ρ.ΠΏ. Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ½ΠΈΠΌΠΊΠ°. ΠΠΎΡΡΡΠΏ ΠΊ ΡΠ½ΠΈΠΌΠΊΡ, ΠΊΠ°ΠΊ ΠΈ ΠΊ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠΈΡΡΠ΅ΠΌΡ, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ½ΠΊΡΠΈΡ CreateToolhelp32Snapshot Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ TH32CS_SNAPPROCESS Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ².
ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΏΠΎ ΡΠΏΠΈΡΠΊΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΡΡ Π² ΡΠ½ΠΈΠΌΠΊΠ΅, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Process32First ΠΈ Process32Next. ΠΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠ΄ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π³Π»Π°Π²Π½ΡΠΉ ΡΡΠ΅Π΄ΠΈ ΠΊΠΎΡΠΎΡΡΡ β ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° (Process Identifier, PID). ΠΡΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΡΠ°ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΡΠ½ΠΊΡΠΈΠΈ SetPriorityClass. ΠΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ, Π½ΠΎ Π½Π΅ ΡΠΎΠΆΠ΄Π΅ΡΡΠ²Π΅Π½Π½ΡΠΉ Π΅ΠΌΡ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠ°ΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠΈΡ ΡΠ°Π±ΠΎΡΡ (ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Ρ ΡΠΆΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ WaitForSingleObject). Π§Π΅ΡΠ΅Π· ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠΎΡΡΠΈΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ OpenProcess.
ΠΠΎΠ΄ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 1.42.
ΠΠΈΡΡΠΈΠ½Π³ 1.42. ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ Tool Helpprocedure TProcessesInfoForm.FillProcessList;
var
SnapProc: THandle;
ProcEntry: TProcessEntry32;
Item: TListItem;
begin
ClearAll;
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ½ΠΈΠΌΠΎΠΊ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π²ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ, Π°
// Π·Π°ΡΠ΅ΠΌ Π² ΡΠΈΠΊΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΡΠΈΡ
// ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΏΠ΅ΡΠ΅Π½ΠΎΡΡ Π΅Π΅ Π² ListProcesses
SnapProc := CreateToolhelp32Snapshot(TH32CS_SNAPROCESSES, 0);
if SnapProc <> INVALID_HANDLE_VALUE then
try
ProcEntry.dwSize := SizeOf(TProcessEntry32);
if Process32First(SnapProc, ProcEntry) then repeat
Item := ListProcesses.Items.Add;
Item.Caption := ProcEntry.szExeFile;
Item.SubItems.Add(IntToStr(ProcEntry.tb32ProcessID);
Item.SubItems.Add(IntToStr(ProcEntry.th32ParentProcessID));
Item.SubItems.Add(IntToStr(ProcEntry.cntThreads));
// Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ PID Π² ΠΏΠΎΠ»Π΅ Data ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ
// ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΠΈΡΠΊΠ°. ΠΠΎΠΎΠ±ΡΠ΅, ΠΏΠΎΠ»Π΅ Data ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ
// Pointer, Π° PID - ΡΡΠΎ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, Π½ΠΎ Ρ.ΠΊ. ΠΎΠ±Π° ΡΡΠΈΡ
// ΡΠΈΠΏΠ° 32-Π±ΠΈΡΠ½ΡΠ΅, ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ Π΄ΡΡΠ³ ΠΊ Π΄ΡΡΠ³Ρ
Item.Data := Pointer(ProcEntry.th32ProcessID);
until not Process32Next(SnapProc, ProcEntry);
finally
CloseHandle(SnapProc);
end
else
begin
ListProcesses.Visible := False;
LabelProcessError.Caption :=
'ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²:'#13#10'ΠΡΠΈΠ±ΠΊΠ° β' +
IntToStr(GetLastError);
end;
end;
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ½ΠΈΠΌΠΎΠΊ. Π€ΡΠ½ΠΊΡΠΈΡ CreateToolhelp32Snapshot Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ TH32CS_SNAPMODULE, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π΅ΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ PID ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ. ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΏΠΎ ΡΠ½ΠΈΠΌΠΊΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Module32First ΠΈ Module32Next. Π ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΌ ΠΊΠΎΠ΄ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 1.42.
1.3.1.2. ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΈ ΡΠ²ΠΎΠΉΡΡΠ² ΠΎΠΊΠΎΠ½
Π‘ΠΏΠΈΡΠΎΠΊ ΠΎΠΊΠΎΠ½, ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ, ΡΠΎΡΠΌΠΈΡΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ EnumWindows, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΠΎΠΊΠΎΠ½ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ (Ρ.Π΅. ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π½Π° ΡΠ°Π±ΠΎΡΠ΅ΠΌ ΡΡΠΎΠ»Π΅). ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΠΈΡ ΠΎΠΊΠΎΠ½ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ GetWindowThreadProcessID ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠΊΠ½Π°, Π½Π΅ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΎΡΡΠ΅ΠΈΠ²Π°ΡΡΡΡ.
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΊΠΎΠ½ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΡ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ EnumChildWindows ΠΈΡΡΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΎΠΊΠ½Π°, Π° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΎΠΊΠΎΠ½ β Π΅Π³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΎΠΊΠ½Π°. ΠΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΡΠ΅ΡΡΡ, ΡΡΠΎ EnumChildWindows Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π½ΠΎ ΠΈ Π²ΡΠ΅ ΠΎΠΊΠ½Π°, ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π²Π»Π°Π΄Π΅ΡΡ ΡΡΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΎΠΊΠ½Π°. Π§ΡΠΎΠ±Ρ Π² Π΄Π΅ΡΠ΅Π²Π΅ ΠΎΠΊΠΎΠ½ Π½Π΅ Π±ΡΠ»ΠΎ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ Π΄Π΅ΡΠ΅Π²Π° ΠΎΠΊΠΎΠ½ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ Π²ΡΠ΅ ΠΎΠΊΠ½Π°, Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ. ΠΠΎΠ΄, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π΄Π΅ΡΠ΅Π²Π°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 1.43.
ΠΠΈΡΡΠΈΠ½Π³ 1.43. ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΎΠΊΠΎΠ½, ΠΎΡΠ½ΠΎΡΡΡΠΈΡ ΡΡ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡfunction EnumWindowsProc(Wnd: HWnd; ParentNode: TTreeNode): BOOL; stdcall;
var
Text: string, TextLen: Integer;
ClassName: array [0..ClassNameLen - 1] of Char;
Node: TTreeNode; NodeName: string;
begin
Result := True;
// ΡΡΠ½ΠΊΡΠΈΡ EnumChildWindows Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ
// Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΡΠΌΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ² ΠΎΠΊΠ½Π°, Π½ΠΎ ΠΈ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ² Π΅Π³ΠΎ
// ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡΠ΅ΡΡΡ Π²ΡΠ΅ ΡΠ΅ ΠΎΠΊΠ½Π°,
// ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΡΠΌΡΠΌΠΈ ΠΏΠΎΡΠΎΠΌΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ
if Assigned(ParentNode) and (THandle(ParentNode.Data) <> GetAncestor(Wnd, GA_PARENT)) then Exit;
TextLen := GetWindowTextLength(Wnd);
SetLength(Text, TextLen);
if TextLen > 0 then GetWindowText(Wnd, PChar(Text), TextLen + 1);
if TextLen > 100 then Text := Copy(Text, 1, 100) + '...';
GetClassName(Wnd, ClassName, ClassNameLen);
ClassName[ClassNameLen - 1] := #0;
if Text = '' then NodeName := 'ΠΠ΅Π· Π½Π°Π·Π²Π°Π½ΠΈΡ (' + ClassName + ')';
else NodeName := Text + ' (' + ClassName + ')';
NodeName := '$' + IntToHex(Wnd, 8) + ' ' + NodeName;
Node := ProcessesInfoForm.TreeWindows.Items.AddChild(ParentNode, NodeName);
Node.Data := Pointer(Wnd);
EnumChildWindows(Wnd, @EnumWindowsProc, LParam(Node));
end;
function EnumTopWindowsProc(Wnd: HWnd; PIDNeeded: Cardinal): BOOL; stdcall;
var
Text: string;
TextLen: Integer;
ClassName: array[0..ClassNameLen - 1] of Chars;
Node: TTreeNode;
NodeName: string;