Обработка сообщений Windows

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Обработка сообщений Windows

Сообщение Александр Андреев » 14.04.2003 (Пн) 17:29

Привет!

Подскажите как мне перехватить сообщение в VB.
Например, в моем проекте имеется форма fMain, для которой я хочу перехватить сообщение WM_GETMINMAXINFO, чтобы запретить изменение ее размеров, если они меньше неких допустимых.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 14.04.2003 (Пн) 17:36

Обрабатывай событие Form_Resize() и все :)

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Обрабатываю...

Сообщение Александр Андреев » 14.04.2003 (Пн) 17:50

Плохо получается... Становятся видны дефекты перерисовки формы.
Мне бы хотелось узнать, есть ли вообще способ подключения обработчиков виндовых сообщений, или же все ограничивается стандартными?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.04.2003 (Вт) 10:20

Вот пример из MSDN:

Это в форму:
Код: Выделить всё
Option Explicit

Private Sub Form_Load()
  'Save handle to the form.
  gHW = Me.hwnd
  'Begin subclassing.
  Hook
End Sub

Private Sub Form_Unload(Cancel As Integer)
  'Stop subclassing.
  Unhook
End Sub


А это в модуль:
Код: Выделить всё
Option Explicit

Private Const GWL_WNDPROC = -4
Private Const WM_GETMINMAXINFO = &H24

Private Type POINTAPI
  x As Long
  y As Long
End Type

Private Type MINMAXINFO
  ptReserved As POINTAPI
  ptMaxSize As POINTAPI
  ptMaxPosition As POINTAPI
  ptMinTrackSize As POINTAPI
  ptMaxTrackSize As POINTAPI
End Type

Global lpPrevWndProc As Long
Global gHW As Long

Private Declare Function DefWindowProc Lib "user32" Alias _
   "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias _
   "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
   ByVal hwnd As Long, ByVal Msg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias _
   "SetWindowLongA" (ByVal hwnd As Long, _
   ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Sub CopyMemoryToMinMaxInfo Lib "KERNEL32" Alias _
   "RtlMoveMemory" (hpvDest As MINMAXINFO, ByVal hpvSource As Long, _
   ByVal cbCopy As Long)
Private Declare Sub CopyMemoryFromMinMaxInfo Lib "KERNEL32" Alias _
   "RtlMoveMemory" (ByVal hpvDest As Long, hpvSource As MINMAXINFO, _
    ByVal cbCopy As Long)

Public Sub Hook()
  'Start subclassing.
  lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub Unhook()
  Dim temp As Long
  'Cease subclassing.
  temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub

      Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
         ByVal wParam As Long, ByVal lParam As Long) As Long
          Dim MinMax As MINMAXINFO

          'Check for request for min/max window sizes.
          If uMsg = WM_GETMINMAXINFO Then
              'Retrieve default MinMax settings
              CopyMemoryToMinMaxInfo MinMax, lParam, Len(MinMax)

              'Specify new minimum size for window.
              MinMax.ptMinTrackSize.x = 200
              MinMax.ptMinTrackSize.y = 200

              'Specify new maximum size for window.
              MinMax.ptMaxTrackSize.x = 500
              MinMax.ptMaxTrackSize.y = 500

              'Copy local structure back.
              CopyMemoryFromMinMaxInfo lParam, MinMax, Len(MinMax)

              WindowProc = DefWindowProc(hw, uMsg, wParam, lParam)
          Else
              WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, _
                 wParam, lParam)
          End If
      End Function


Только учти, прежде чем завершать задачу, тебе надо вернуть стандартный обработчик. Если ты остановишь этот пример в IDE, то слетит IDE.
Lasciate ogni speranza, voi ch'entrate.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Спасибо

Сообщение Александр Андреев » 16.04.2003 (Ср) 11:46

Мда, перехватывать сообщения через хуки это конечно высший пилотаж :lol:
Спасибо.

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Сообщение v-adix » 16.04.2003 (Ср) 19:41

не совсем понял вопрос, какие именно сообщения надо перехватывать. MIN,MAX,щелчок по заголовку могу сказать как отловить. ты об этом спрашивал?

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 17.04.2003 (Чт) 21:01

Нет. Есть такое сообщение в Виндосе - WM_GETMINMAXINFO, которое посылается окну при попытке изменения его размеров, и запрашивает у этого окна границы, в пределах которых можно эти размеры менять. Я хотел узнать как такое сообщение обрабатывать в VB. Узнал, благодаря alibek'у. Но тебе тоже спасибо. :wink:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 67

    TopList