Как Вы вынуждаете Java swt программа “переместить себя в передний план”?

В настоящее время с swt, я иногда хочу, чтобы программа произвольно прибыла в передний план (как будильник, мог бы).

Обычно следующие работы (jruby):

@shell.setMinimized(false)
@shell.forceActive

Это выявляет оболочку, если она была минимизирована.

Создание новой оболочки в любое время также приносит (новая оболочка) к передней стороне.

Пока неплохо, однако, если оболочка не минимизирована, вышеупомянутый код просто высвечивается (мигает) значком приложения в панели задач. Хорошо на самом деле в первый раз, когда Вы выполняете его, это выявляет его. После этого это просто мигает в панели задач. Это - окна. На Linux это, кажется, только мигает в панели задач (значение по умолчанию человечности).

Кто-либо знает о кросс-платформенном способе заставить приложение бросаться в глаза в swt?

Кажется, что никакое колдовство forceActive setActive setMinimized (ложь) setFocus forceFocus и setVisible не может выполнить эту вещь.

Я вполне уверен, это возможно (по крайней мере, в окнах), поскольку Текстовый редактор E делает это. Ну, это не swt, но по крайней мере некоторые другие приложения, как было известно, сделали это.

Я думаю, возможно, что это - swt ошибка 192036?

Большое спасибо.

Похожие страницы:

16
задан Community 23 May 2017 в 12:18
поделиться

2 ответа

http://github.com/rdp/redcar/commit/d7dfeb8e77f13e5596b11df3027da236f23c83f0

показывает, как я сделал это в windows, в любом случае (используя ffi).

Пара полезных трюков "может быть"

добавьте 'sleep 0.1' после BringToFront.SetForegroundWindow(wanted) (надеюсь, это не обязательно).

добавить shell.set_active после того, как вы вывели окно на передний план. По какой-то причине forceActive не вызывает setActive.

Обратите внимание, что setActive выполняет вызов user32.dll BringWindowToTop и должен быть выполнен до отсоединения ввода потока.

Заметим также, что, похоже, если вы сможете выполнить вызовы в правильном порядке, вам может вообще не понадобиться использовать хак ввода потоков (?)

http://betterlogic.com/roger/?p=2950

(содержит несколько хороших подсказок о том, как это сделать правильно)

В Linux forceActive работает - но только до тех пор, пока вы не перейдете на несколько других окон, после чего он мигает на панели задач (только). Предполагаю, что это баг swt. [1]

Также связано:

Как вывести окно на передний план?

http://github.com/jarmo/win32screenshot/blob/master/lib/win32/screenshot/bitmap_maker.rb#L110 "set_foreground", который, кажется, работает с и xp и windows 7

[1] Нужно вывести приложение на передний план на Windows и https://bugs.eclipse.org/bugs/show_bug.cgi?id=303710

6
ответ дан 30 November 2019 в 22:02
поделиться

На самом деле это функция Windows, которую можно включить с помощью игрушки Tweak UI power (по крайней мере, для Windows XP). Когда эта функция включена, ОС намеренно не позволяет окну заставлять себя быть сфокусированным окном, чтобы остановить "кражу фокуса". Таким образом, действие по захвату фокуса меняется на простое мигание значка панели задач - поскольку O/S намеренно меняет действие по просьбе пользователя, вы ничего не сможете с этим поделать (и это хорошо).

Это было сделано (вероятно) потому, что так многие приложения злоупотребляли bring-to-front API, и такое поведение раздражало пользователей и заставляло их вводить данные не в то приложение.

4
ответ дан 30 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: