- очередь особщений, структура MSG
  typedef struct tagMSG { -   HWND   hwnd;
  UINT   message;
  WPARAM wParam;
  LPARAM lParam;
  DWORD  time;
  POINT  pt;
 -   } MSG, PMSG, LPMSG; 
- system, user, app, registered - 
- system 0x0000-0x03FF - определенные системой
- user 0x0400-0x07FF - для private window classes
- app 0x0800-0xBFFF - private messages для приложений версии 4.0
- registered 0xC000-0xFFFF - registered - регистрируются с помощью RegisterWindowMessage 
- используется для сообщений которые должны слаться между разными процессами и между окон разных классов
- уникальны для всей системы
- если два приложения зарегистрируют сообщение с одинаковой строкой, то им вернется один и тот же идентификатор (в этом вся фишка)
UINT WINAPI RegisterWindowMessage(
  In  LPCTSTR lpString
);
 
 
- цикл обработки сообщений
  BOOL WINAPI GetMessage( -   _Out_     LPMSG lpMsg,            // куда записывать инфо
  _In_opt_  HWND hWnd,            // какому окну предназанчается сообщение (если NULL - текущий пооток)
  _In_      UINT wMsgFilterMin,    // минимальное допустимое значение сообщение
  _In_      UINT wMsgFilterMax    // максимально ...
 -   );
  TranslateMessage( MSG ) - транслирует соощение о virtual-key в сообщения  онажатии конкретной клавиши (новые сообщения постятся в очередь текущего потока)
  DispatchMessage( MSG ) - передает сообщение оконной процедуре 
- ввод с клавиатуры, мыши, команд меню и нотификации от контролов - 
- Клава (с шестого этажа)
- WM_KEYDOWN ( о системных клавишах )
- wParam - код клавиши
- lParam - побитовая кодировка контекста (количество повторов при зажатии клавиши,  зажат ли Alt или Ctrl)
 
- WM_CHAR ( о символьных клавишах ) - они появляются только после TranslateMessage
- wParam - код клавиши
- lParam - тот же что и у WM_KEYDOWN
 
 
- Мышь 
- WM_*BUTTONDOWN/UP/DBLCLK     // последнее - если класс определен с нужным флагом
- lParam - координаты, вытаскиваются макросами GET_X_LPARAM GET_Y_LPARAM
- wParam - доп инфа (зажат ли Ctrl или Shift, или другие кнопки мыши)
 
- WM_NC*BUTTONDOWN
- сообщения о  действиях мыши в неклиентской зоне
- обычно игнорятся приложением (система сама их обрабатывает)
 
 
 
- очереди, приоритет и т д 
- subclass superclass - 
- subclassing
- возможность обрабатывать сообщения окна X, до того, как X начал их обрабатывать
- требование, оно должно быть в этом же процессе 
- для одного окна
- вызываем SetWindowLong и подменяем  оконную процедуру (и сохраняем адрес старой, чтобы могли посылать сообщения далее)
- пример - запретить EditControl'у принимать некоторый свойствы
 
 
- для всех
- вызываем SetWindowClass иподменяем оконную процедуру 
- пометка: для функции нам надознать хэндл окна, потому обычно создается скрытое окно этого класса и его хэндл посылается в SetClassLong
 
 
- отличие, мы не создаем отдельный класс, а подменяем либо в окне, либо в существующем классе
- важно: УДАЛЯТЬ все созданные subclass притом в порядке обратном их созданию
 
- superclassing
- создаем класс, основанный на некотором baseклассе + некоторые фичи
- также, за счет этого, мы можем оброабатывать WM_CREATE и WM_NCCREATE
- проделываем так:
- GetClassInfo
- подменяем hInstance, wndProc и имя
- регистрируем новый класс