Q:

Какие существуют "события"?

Большинство событий, на которые реагирует прикладная программа
с графическим пользовательским интерфейсом, происходят при взаимодействии пользователя с этой программой.
Какие существуют еще события?
update

Операционная система Windows
Язык программирования Java
Windows API

A:

Начал писать коммент, но вышел за рамки и решил опубликовать как ответ.
Событие весьма распространенный шаблон ООП. 

Событие в объектно-ориентированном программировании — это сообщение, которое возникает в различных точках исполняемого кода при выполнении определённых условий.
  События предназначены для того, чтобы иметь возможность предусмотреть реакцию программного обеспечения

Соответственно, классы-события разработчики могут определять по собственному усмотрению в любых ситуациях когда требуется реагировать на изменения состояния объектов извне.
Список событий в любом ОО-языке (как минимум) будет бесконечен.
Вопрос, тем не менее, может иметь смысл для стандартных событий в конкретной библиотеке графических компонентов. Проблема в том, что как для Windows так и для Java существует множество популярных платформ разработки интерфейса каждая со своим набором событий.
Например (и это только для десктопа): 

для Windows: Win32, Winforms, WPF;
для Java: AWT, Swing, Java FX.

В качестве общего подхода могу предложить:

определиться с платформой/библиотекой ;
найти для платформы/библиотеки базовый класс событий (Event, Listener);
либо найти определенное событие и проверить от какого класса он наследуется.

Например:

для Java Swing: посмотрите на пакет javax.swing.event
для .Net: можно начать с урока Events and Delegates на MSDN, либо поискать события определенные для каждого класса (например Form)

A:

Вопрос слишком общий. События можно разделить по многим категориям, многие из которых во многом пересекаются.
Например:

Внешние, порожденные "снаружи" рабочей станции (обычно это сеть).
Внутренние, порожденные "на рабочей станции" (разнообразные устройства ввода).
Внутренние, порожденные "внутри" рабочей станции (таймеры, другие приложения)

Для вашего приложения, события могут быть:

вызваны штатной работой вашей программы (вы сами создаете и отправляете события внутри)
предоставлены / обернуты фреймворком (пользовательский ввод, стандартные события ОС)
событиями на которые вы подпишитесь (в обход фреймворка)

A:

Выскажу слегка парадоксальную мысль.
Ваше наблюдение:

Большинство событий, на которые реагирует прикладная программа с графическим пользовательским интерфейсом, происходят при взаимодействии пользователя с этой программой.

Является чуточку ложным, поскольку это как раз события в рамках концепции Event-Driven-Programming - событийно-ориентированное программирование. Именно для GUI и была в свое время разработана эта концепция (70-е годы наверное), хотя легко можно представить и другую реализацию GUI, где ее можно реализовать без событий.
В рамках расширенного толкования Event-Driven-Programming, событием можно сделать практически все что угодно. Есть различные фреймворки, в терминах, которых почти все что угодно может порождать события.
Например: завершение работы какого-либо метода легко может порождать событие, которое встраивается в общую схему обработки событий в виде MyMessage - сообщения об его завершении:
public void myMethod(int myParameter) {
     //blah-blah
     MyEventManager.triggerEvent(this, new MyMessage("bye!"));
}

Где есть некий слушатель событий MyEventManager, далее обрабатывающий посланное сообщение и перенаправляющий поток программы куда следует.
Ну и т.д. В общем все зависит от пожеланий программиста.
Естественно существуют и недостатки таковой системы, одним из главных недостатков является низкая портабельность кода и несоответствие парадигме: write once, use everywhere

