Russian Qt Forum

Qt => Общие вопросы => Тема начата: Красаффчег от Июль 08, 2006, 00:41



Название: Как ловить события за пределами приложения?
Отправлено: Красаффчег от Июль 08, 2006, 00:41
Всем доброго времени суток!
Господа, подскажите, можно ли ловить события происходящие за пределами моего приложения и если да то каким образом?
Иначе говоря есть главное окно (QMainWindow), для которого можно переопределить соответствующую ф-цию event и ловить в пределах этого окна любые события. Тоже самое можно с успехом делать и другими способами.

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

Из ман я понял что такое возможно сделать (см описание класса QEvent: "In general, events come from the underlying window system (spontaneous() returns true)..."), но как мне не совсем ясно. Пробовал переопределять event как классе производном как от QMainWindow, так и QApplication. Работает только в пределах окна.

Пробовал по таймеру определять состояние кнопок мыши (if (QApplication::mouseButtons() == Qt::LeftButton) ...), работает тоже только в пределах окна.

Я уверен, что решение должно существовать. Надежду даёт эта ф-ция - bool QEvent::spontaneous () const
Returns true if the event originated outside the application (a system event); otherwise returns false.
Но блин, как всё это организовать не пойму.

З.Ы.
Необходимость в этом возникла в связи с использованием убогого попуп меню в TrayIcon (http://svn.berlios.de/viewcvs/wolfpack/trunk/server/src/gui/trayicon/), которое само не закрывается если кликнуть на свободном пространстве рабочего стола. Сиё поведение меня очень раздражает, поэтому мн необходимо самостоятельно его закрывать по клику на рабочем столе.
Надеюсь ясно выразился, спасибо. :wink:


Название: Как ловить события за пределами приложения?
Отправлено: Красаффчег от Июль 09, 2006, 13:12
Проблемы с убогим меню в TrayIcon более менее решил. Теперь оно нормально закрывается и отображается поверх панели задач (раньше ниже неё не опускалось).
Для этого пришлось немного модифицировать класс TrayIcon. Оригинальные файлы взяты по вышеупомянутой ссылке (переписанные для 4-й кути).
Для автоматического закрытия попуп меню добавил pop->activateWindow() после его показа. А для показа его над панелью задач вместо pop->popup(e->globalPos()) пришлось использовать pop->move(x, y) и pop->setVisible(true), предварительно пересчитывая x и y исходя из размеров меню и координаты точки в которой происходит его показ. Пересчёт необходим по двум причинам (различные точки отсчёта координат для методов popup и move, и отсутствие автоматических перенаправлений показа меню в случае его невмещения на экране).

Единственное что получилось коряво, до первого показа меню его размер не определён (точнее 101 на 101 пикс, независимо от содержимого), поэтому в конструктор необходимо передавать этот размер.

НО вопрос на этом всё равно остаётся открытым. Т.е как мне ловить события извне? Например прога сидит глубоко в трее, вне фокуса или вообще инвизибл. Как активизировать её по нажатию скажем "Window+Insert"? Например так как делает это лингва по нажатию "Ctrl+Insert+Insert", или невидимый микшер управляемый глобальными горячими клавишами.
Неужели никто не знает???


Название: Как ловить события за пределами приложения?
Отправлено: Steven_Orko от Июль 09, 2006, 23:42
Не знаю на счет средств Qt, не пробывал, но чисто апишными средствами надо ставит ловушку, так называемый hook, которая будет отслеживать события мыши и нажатия клавы. Причем даже неважно, работает ли твое приожение или нет. В ОС несколько типов ловушек, и даже ловушек одного типа несколько, потому есть несколько правил, при написании ловушки. В изучении этих правил тебе поможет google или yandex.