Глобальный низкоуровневый хук мыши вызывает зависание при нажатии на кнопки в строке заголовка - PullRequest
3 голосов
/ 21 ноября 2010

Я пишу дополнение для IE.Мне нужно закрыть модальное диалоговое окно при внешнем щелчке.

До сих пор я использовал WM_NCACTIVATE для получения этих уведомлений, но кажется, что в Windows 7 (IE8) я не получаю это сообщение (яработает на низкой целостности, и я проверил это с помощью spy ++; похоже, он работает, когда я работаю с высокой степенью целостности - странные вещи).

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

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

После некоторых онлайн-исследований я понял, что это общая проблема, но яне нашел решения.Некоторые люди говорили, что это проблемы с производительностью, но даже если моя функция ловушки вызывает только «CallNextHook», это все равно происходит.

Есть идеи, как это исправить, или альтернативные идеи, чтобы закрыть модальное диалоговое окно при внешнем щелчке?

Ответы [ 3 ]

1 голос
/ 29 июня 2012

Я исправил это, удалив WH_MOUSE_LL.Это прекрасно работает в Windows XP, но останавливает ВСЁ КОМПЬЮТЕР, а иногда и до тех пор, пока я НЕ ВКЛЮЧАЮ И ВЫКЛЮЧУЮ КОМПЬЮТЕР.

Я думаю, что смешно, что они не исправили эту ошибку.Это потеряло много моего времени.

0 голосов
/ 29 июня 2012

Обоснованное предположение : Я подозреваю, что, поскольку вы являетесь надстройкой IE, вы работаете в процессе с низким уровнем целостности (именно так работает защищенный режим IE).Процессы с низким уровнем целостности не могут по умолчанию отправлять оконные сообщения процессам со средним или высоким уровнем целостности.Строка заголовка, вероятно, является частью кадра IE, что, вероятно, является процессом средней целостности.При обработке хука, возможно, вы вызываете отправку дополнительного сообщения.Например, поскольку это щелчок за пределами вашего диалога, вы можете отправить сообщение, чтобы закрыть диалоговое окно.Механизм целостности блокирует сообщение, потому что вы пересекаете границу низкой целостности / средней целостности.Через пять секунд система определяет, что приложение перестало отвечать на запросы, и ему удается открепить исходное сообщение о клике.

Другими словами: установка низкоуровневого хука из процесса с низким уровнем целостности почти наверняка являетсяплохая идея.

(Глобальные хуки, как правило, обычно являются плохой идеей, поскольку они накладывают затраты на все процессы пользовательского интерфейса в системе. Другие программы не должны платить налог за вашу программу, чтобыведите себя правильно.)

Модальные диалоговые окна в Windows имеют кнопки управления ОК / Отмена / Отмена.Ваш не должен быть исключением.Отклонение диалогового окна путем щелчка мышью противоречит модели проектирования, поэтому у вас, скорее всего, возникнут проблемы с реализацией этого, и даже если вы справились с хрупким взломом, это может запутать и раздражать ваших пользователей.

Другоеэлементы в Windows, такие как всплывающие или раскрывающиеся меню, выполняют замыкание при щелчке мышью (см. SetCapture ), что позволяет коду меню видеть, когда мышь что-то делаетза окном.Но это будет очень сложно сделать для диалога, так как диалог имеет дочерние элементы управления, которые также должны взаимодействовать с мышью.Захват мыши помешает детям получать нужные им сообщения.

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

0 голосов
/ 22 ноября 2010

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

Это была проблема инверсии приоритета.Попробуйте повысить приоритет потока, из которого вы устанавливаете ловушку, вызвав SetThreadPriority .

...