#define STRICT
#include <windows.h>

// Прототипы функций
int max(int value1, int value2);
int min(int value1, int value2);

// --------------------------------------------
// Функция max
// --------------------------------------------
int max(int value1, int value2)
{
  return((value1 > value2) ? value1 : value2);
}

// --------------------------------------------
// Функция min
// --------------------------------------------
int min(int value1, int value2)
{
  return((value1 < value2) ? value1 : value2);
}

// =====================================
// Функция WndProc
// =====================================
LRESULT CALLBACK _export
WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  static POINT pt;
  RECT rc;

  switch (msg)
  {
    // Нажали клавишу
    case WM_KEYDOWN:
    {
      // Получаем теущие экранные
      // координаты курсора мыши 
      GetCursorPos(&pt);

      // Преобразуем экранные координаты
      // в оконные координаты
      ScreenToClient(hwnd, &pt);

      // Для клавиш позиционирования текстового
      // курсора изменяем соответствующим образом
      // координаты курсора мыши
      switch(wParam)
      {
	case VK_DOWN:  // вниз
	{
          pt.y += 20;
	  break;
        }
	case VK_UP:    // вверх
        {
	  pt.y -= 20;
	  break;
        }
	case VK_LEFT:  // влево
        {
	  pt.x -= 20;
	  break;
        }
	case VK_RIGHT: // вправо
        {
	  pt.x += 20;
	  break;
	}
	// Для всех остальных клавиш
        // ничего не делаем
	default:
	{
          return 0;
        }
      }

      // Получаем координаты внутренней
      // области окна
      GetClientRect(hwnd, &rc);

      // Вычисляем новые координаты курсора мыши
      // таким образом, чтобы курсор не выходил
      // за пределы окна
      pt.x = max(min(pt.x, rc.right),  rc.left);
      pt.y = max(min(pt.y, rc.bottom), rc.top);

      // Преобразуем оконные координаты в экранные
      ClientToScreen(hwnd, &pt);

      // Устанавливаем курсор мыши
      // в новую позицию
      SetCursorPos(pt.x, pt.y);

      return 0;
    }

    case WM_DESTROY:
    {
      PostQuitMessage(0);
      return 0;
    }
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}

