// ----------------------------------------
// Определение типа клавиатуры
// ----------------------------------------

#define STRICT
#include <windows.h>

#pragma argsused

int PASCAL
WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR     lpszCmdLine,
	int       nCmdShow)
{
  // Рабочий буфер
  char szBuf[80];

  // Рабочие переменные
  int type, subtype, nfkeys, size;

  // Типы клавиатур
  char *apszKbTypes[] =
  {
    "IBM PX/XT",
    "Olivetti ICO",
    "IBM AT",
    "IBM Enhanced",
    "Nokia 1050",
    "Nokia 9140",
    "Японская",
  };

  // Определяем тип клавиатуры
  type = GetKeyboardType(0);

  // Он должен лежать в интервале от
  // 1 до 7. Если это не так, завершаем
  // работу приложения с сообщением об ошибке
  if (type == 0 || type > 7)
  {
    MessageBox(NULL, "Ошибка в типе клавиатуры",
      "KBTYPE Application", MB_ICONSTOP);
    return 0;
  }

  // Определяем подтип клавиатуры
  subtype = GetKeyboardType(1);

  // Определяем количество функциональных
  // клавиш
  nfkeys  = GetKeyboardType(2);

  // Подготавливаем буфер и выводим его

  size = wsprintf(szBuf,
    "Клавиатура %s,\nподтип %d,\n",
    (LPSTR)apszKbTypes[type-1], subtype);

  wsprintf(szBuf + size,
    " %d функциональных клавиш",
    nfkeys);

  MessageBox(NULL, szBuf,
    "KBTYPE Application", MB_OK | MB_ICONINFORMATION);

  return 0;
}