Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 33

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

Вторая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ 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 Help

procedure 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;