2012-05-31 3 views
2

Я пытаюсь реализовать глобальные горячие клавиши в Mono и X11. К сожалению, приложение использует System.Windows.Forms, поэтому я не могу использовать фильтр событий GDK #, предложенный в this question.Глобальные горячие клавиши в Mono

Работает XGrabKey, но у меня возникла проблема с циклом события. При закрытии приложения поток, обрабатывающий цикл событий X11, все еще зависает в XNextEvent. Есть ли способ обойти это? Я бы предпочел не прибегать к опросу с XPending. Могу ли я как-то отменить XNextEvent или отправить фиктивное событие?

Я звоню XGrabKey на корневое окно, поэтому, к сожалению, я не получаю никаких событий, таких как DestroyNotify или UnmapNotify.

+0

Почему бы не иметь определенную платформу в вашей программе? то вы можете использовать GDK/GTK. Anyhoo .. – IanNorton

+0

Ну, это часть определенной части платформы, поскольку, очевидно, использование 'XGrabKey' не будет работать в Windows. Но переход с SWF на Gtk # не является опцией, и вытягивание всего Gtk # просто для этого кажется излишним. – bseibold

+0

Я знаю, что это очень старый пост, но я нахожусь в той же ситуации, и, похоже, вам удалось заставить его работать, у вас есть место, где этот код доступен? Или вы можете опубликовать его как решение? – Gusman

ответ

1

Использовать XSendEvent для отправки XClientMessageEvent. Создайте свой собственный атом и установите член Atom, чтобы другие приложения, которые могли смотреть за XClientMessageEvent в корневом окне, не пострадали.

В вашем цикле событий проверьте этот атом и выйдите, если вы его получите.

+0

Звучит неплохо, я попробую, как только смогу. – bseibold

+0

Я сделал что-то подобное сейчас. Так как в любом случае мне нужно окно, я использую событие 'DestroyNotify' окна вместо' ClientMessage'. Однако предлагаемое решение должно работать. – bseibold

Смежные вопросы