.386
.model flat, stdcall
option casemap :none

include windows.inc
include kernel32.inc
include user32.inc
include gdi32.inc

includelib kernel32.lib
includelib user32.lib
includelib gdi32.lib

; ############# Объявления функций ########################################
InitNOINPUTEDITControl proto
NoInputEditProc proto :HWND, :UINT, :DWORD, :DWORD
; #########################################################################

.data

szEdit db"EDIT", 0
szNoInputEdit db "NOINPUTEDIT", 0

.data

lpfnOldEditProc dd ?

.code

; #########################################################################
InitNOINPUTEDITControl proc
  local wc:WNDCLASSEX
  local hInst:HINSTANCE

  invoke GetModuleHandle, NULL
  mov hInst, eax
  ; Получаем характеристики класса "edit"
  mov wc.cbSize, sizeof WNDCLASSEX
  invoke GetClassInfoEx, hInst, addr szEdit, addr wc
  ; Модифицируем параметры
  push hInst                                    ; хэндл модуля
  pop wc.hInstance
  mov wc.lpszClassName, offset szNoInputEdit    ; новое имя класса
  push wc.lpfnWndProc                           ; сохраняем адрес прежней функции обработки сообщений
  pop lpfnOldEditProc
  mov wc.lpfnWndProc, offset NoInputEditProc
  invoke LoadCursor, NULL, IDC_ARROW            ; стандартный курсор
  mov wc.hCursor, eax
  ; Регистрируем новый класс
  invoke RegisterClassEx, addr wc

  ret

InitNOINPUTEDITControl endp
; #########################################################################
NoInputEditProc proc hEdit:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

  .if uMsg == WM_CHAR
    ; Игнорируем ввод символов
    
  .elseif uMsg == WM_KEYDOWN
    mov eax, wParam
    .if al == VK_LEFT || al == VK_RIGHT || al == VK_HOME || al == VK_END
      invoke CallWindowProc, lpfnOldEditProc, hEdit, uMsg, wParam, lParam
      ret    
    .endif 
  .else
    invoke CallWindowProc, lpfnOldEditProc, hEdit, uMsg, wParam, lParam
    ret
  .endif

  xor eax, eax
  ret

NoInputEditProc endp

end
; #########################################################################
