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

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

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

Ѐункция TranslateMessage, которая ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ вызываСтся Π² ΠΏΠ΅Ρ‚Π»Π΅ сообщСний, слуТит для трансляции ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹Ρ… сообщСнии (Ссли пСтля сообщСний рСализуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСнии Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΠΎΠΊΠ½Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, COM/DCOM, ΠΈΠ»ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π²Π²ΠΎΠ΄ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π½Π΅ обрабатываСтся ΠΈΠ»ΠΈ обрабатываСтся нСстандартным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹Π·ΠΎΠ² TranslateMessage ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ). Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅, систСма посылаСт ΠΎΠΊΠ½Ρƒ, находящСму Π² фокусС, сообщСниС WM_KEYDOWN. Π§Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ этого сообщСния пСрСдаётся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши β€” Π΄Π²ΡƒΡ…Π±Π°ΠΉΡ‚Π½ΠΎΠ΅ число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ опрСдСляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΠΈ Π½Π΅ зависит ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ раскладки, состояния клавиш <CapsLock> ΠΈ Ρ‚.ΠΏ. Ѐункция TranslateMessage. ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ² Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС, добавляСт Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ (ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ Π² ΠΊΠΎΠ½Π΅Ρ†, Π° Π² Π½Π°Ρ‡Π°Π»ΠΎ) сообщСниС WM_CHAR, Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ пСрСдаСтся ΠΊΠΎΠ΄ символа, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавишС, с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ раскладки, состояния клавиш <CapsLock>, <Shift> ΠΈ Ρ‚. ΠΏ. ИмСнно функция TranslateMessage ΠΏΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ клавиши опрСдСляСт ΠΊΠΎΠ΄ символа. ΠŸΡ€ΠΈ этом Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ любой клавиши ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ WM_KEYDOWN, Π° Π²ΠΎΡ‚ WM_CHAR гСнСрируСтся Π½Π΅ для всСх клавиш, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ символу (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ WM_CHAR Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… клавиш, ΠΊΠ°ΠΊ <Shift> <Ctrl>, <Insert>, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… клавиш).

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π£ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² VCL Π΅ΡΡ‚ΡŒ события OnKeyDown ΠΈ OnKeyPress. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ сообщСния WM_KEYDOWN, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ β€” сообщСния WM_CHAR.

Если ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний пуста, функция GetMessage ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° Ρ‚Π°ΠΌ Π½Π΅ появится хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ сообщСниС, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС этого Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’ΠΎ врСмя этого оТидания Π½ΠΈΡ‚ΡŒ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ процСссор.

ΠŸΠ΅Ρ‚Π»Ρ сообщСний ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ сообщСниС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° оконная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, сообщСниС, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… сообщСний, ΠΈ всС ΠΎΠΊΠ½Π°, созданныС Π΄Π°Π½Π½ΠΎΠΉ Π½ΠΈΡ‚ΡŒΡŽ, ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°ΡŽΡ‚ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ИмСнно этим ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ зависаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· своих ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сообщСний Π΄Π΅Π»Π°Π΅Ρ‚ матСматичСскиС расчСты ΠΈΠ»ΠΈ выполняСт Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ запрос ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…: сообщСния Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π½ΠΎ Π½Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΈΠ· Π½Π΅Π΅ ΠΈ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ сообщСния закончится, всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ сообщСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Ρ‹ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ зависания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ организация локальной ΠΏΠ΅Ρ‚Π»ΠΈ сообщСний. Если ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСния, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ трСбуСтся ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, содСрТит Ρ†ΠΈΠΊΠ», Π² Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PeekMessage, которая позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСния. Если сообщСния ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ DispatchMessage для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΡ… Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ. Π’ этом случаС сообщСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π‘Π»ΠΎΠΊ-схСма ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, содСрТащСй Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ‚Π»ΡŽ сообщСний, ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° рис. 1.5 (для краткости Π² Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΠ΅Ρ‚Π»Π΅ сообщСний ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ самых Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: GetMessage ΠΈ DispatchMessage, хотя ΠΈ Π² этом случаС главная пСтля Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ выглядит Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π½Π° рис. 1.4).

ΠŸΡ€ΠΈ использовании локальной ΠΏΠ΅Ρ‚Π»ΠΈ сообщСний сущСствуСт ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ бСсконСчной рСкурсии. Рассмотрим это Π½Π° простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ слоТный ΠΊΠΎΠ΄, содСрТащий Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ‚Π»ΡŽ сообщСний, выполняСтся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ прилоТСния. Пока ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ выполняСтся, Π½Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π»ΠΈΠ²Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ снова Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ, запустив Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΈ Ρ‚Π°ΠΊ нСсколько Ρ€Π°Π·. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΡ‡Π΅Π½ΡŒ Π³Π»ΡƒΠ±ΠΎΠΊΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ вряд Π»ΠΈ смоТСт (тСрпСния Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚), Π½ΠΎ часто Π΄Π°ΠΆΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ нСсколько Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π²Ρ‹Π·Π²Π°Π½Ρ‹ рСкурсивно, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСприятным послСдствиям. А Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ‚Π»ΡŽ сообщСний Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ сообщСний Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, Ρ‚ΠΎ здСсь рСкурсия Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π΄ΠΎ пСрСполнСния стСка. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ‚Π»ΠΈ сообщСний слСдуСт ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ² рСкурсии. НапримСр, Π² случаС с ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ Π΅Π΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ (Enabled := False), ΠΈ вновь Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС окончания ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚ΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ смоТСт Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ локальной ΠΏΠ΅Ρ‚Π»ΠΈ сообщСний. Π’ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сообщСниС, Π½Π΅ привязанноС Π½ΠΈ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PostThreadMessage. Π’Π°ΠΊΠΈΠ΅ сообщСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΏΠ΅Ρ‚Π»Π΅ сообщСний, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ функция DispatchMessage ΠΈΡ… просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚.

Рис. 1.6. Π‘Π»ΠΎΠΊ-схСма ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с локальной ΠΏΠ΅Ρ‚Π»Π΅ΠΉ сообщСний


Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‚ΡΡ сразу нСскольким ΠΎΠΊΠ½Π°ΠΌ. ΠŸΡ€ΠΎΡ‰Π΅ всСго ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PostMessage, ΡƒΠΊΠ°Π·Π°Π² Π² качСствС адрСсата Π½Π΅ дСскриптор ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π° константу HWND_BROADCAST. Π’Π°ΠΊΠΎΠ΅ сообщСниС ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ всС ΠΎΠΊΠ½Π°, располоТСнныС нСпосрСдствСнно Π½Π° Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ столС ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈ этом Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π² (Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… систСмы). БущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ функция BroadcastSystemMessage (начиная с Windows Π₯Π  β€” Π΅Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ BroadcastSystemMessageEx), которая позволяСт ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΎΠΊΠ½Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сообщСниС.

ΠšΡ€ΠΎΠΌΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² wParam ΠΈ lParam, ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ приписываСтся врСмя ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ курсора Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ возникновСния. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля Π΅ΡΡ‚ΡŒ Π² структурС TMsg, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetMessage ΠΈ DispatchMessage, Π½ΠΎ Ρƒ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π½Π΅ прСдусмотрСны ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ курсора ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСния ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ GetMessageTime ΠΈ GetMessagePos соотвСтствСнно.

БущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния Π±Π΅Π· участия DispatchMessage ΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Если эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ сообщСниС, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½ΠΎΠ΅ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΊΠ°ΠΊ "своС", ΠΎΠ½ΠΈ сами Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ дСйствия ΠΏΠΎ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, ΠΈ Ρ‚ΠΎΠ³Π΄Π° TranslateMessage ΠΈ DispatchMessage Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. К этим функциям, Π² частности, относятся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

β–‘ TranslateAccelerator β€” Π½Π° основС Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· рСсурсов Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ распознаСт Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ "горячих" клавиш мСню ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, пСрСдавая Π΅ΠΉ сообщСниС WM_COMMAND ΠΈΠ»ΠΈ WM_SYSCOMMAND, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ Ρ‚ΠΎΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ посылаСтся ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ;

β–‘ TranslateMDISysAccel β€” Π°Π½Π°Π»ΠΎΠ³ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ распознаСт "горячиС" клавиши систСмного мСню MDI-ΠΎΠΊΠΎΠ½;

β–‘ IsDialogMessage β€” распознаСт сообщСния, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ особый смысл для Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиши <Tab> для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами управлСния). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π½Π΅ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ ΠΈ ΠΎΠΊΠΎΠ½, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹ΠΌΠΈ (Ρ‚.Π΅. созданными Π±Π΅Π· ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ CreateDialogXXXX), Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ нСобходимости Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² ΠΏΠ΅Ρ‚Π»ΡŽ сообщСний. Листинг 1.6 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ пСтля сообщСний, содСрТащая Π²Ρ‹Π·ΠΎΠ² TranslateAccelerator для Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ MDI-Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ TranslateMDISysAccel для Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ.

Листинг 1.6. ΠŸΠ΅Ρ‚Π»Ρ сообщСнии с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ "горячих" клавиш Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ мСню ΠΈ систСмного мСню MDI-ΠΎΠΊΠΎΠ½

while GetMessage(Msg, 0, 0, 0) do

 if not TranslateMDISysAccel(ActiveMDIChildHandle, Msg)

  and not TranslateAccelerator(MDIFormHandle, AccHandle, Msg) then

 begin

  TranslateMessage(Msg);

  DispatchMessage(Msg);

 end;

ΠŸΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ сообщСния, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ посылки, ΠΎΠ½ΠΎ Π½Π΅ ставится Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π° пСрСдаСтся ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SendMessage. Если эта функция вызываСтся ΠΈΠ· Ρ‚ΠΎΠΉ ΠΆΠ΅ Π½ΠΈΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΠΊΠ½ΠΎ-адрСсат, Ρ‚ΠΎ фактичСски это эквивалСнтно прямому Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Если ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½ΠΈΡ‚ΠΈ, Π΄Π°Π½Π½ΠΎΠ΅ сообщСниС становится Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽ Π±ΠΎΠ»Π΅Π΅ высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Ρ‡Π΅ΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для посланных сообщСний. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetMessage ΠΈ PeekMessage сначала Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ всС сообщСния ΠΈΠ· этой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ ΠΈΡ… Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, ΠΈ лишь Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ ΠΊ Π°Π½Π°Π»ΠΈΠ·Ρƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ посланных сообщСний.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сообщСния, ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠΊΠ½Ρƒ, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π»ΠΈΠ±ΠΎ Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ GetMessage ΠΈΠ»ΠΈ PeekMessage, Ρ‚ΠΎ эти сообщСния Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TranslateMDISysAccel, TranslateAccelerator ΠΈ TranslateMessage. Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΎΠΊΠ½Ρƒ сообщСний, ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиш Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅. Π’Π°ΠΊΠΈΠ΅ сообщСния ΠΎΠΊΠ½Ρƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ, Π° Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΡˆΠ»ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΎΠΊΠ½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π½Π° Π½ΠΈΡ… ΠΎΡ‚Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Π»ΠΎ. Для эмуляции сообщСний ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ keybd_event, Π½ΠΎ ΠΎΠ½Π° посылаСт сообщСниС Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ, Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π΅ всСгда ΡƒΠ΄ΠΎΠ±Π½ΠΎ.