Перехват и скрытие окна до его появления - PullRequest
2 голосов
/ 03 декабря 2010

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

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

Вот что я думал сделать до сих пор:

  1. Создать общесистемный хук на WM_CREATE
  2. Когда поймано, проверьте класс и процесс цели WM_CREATE
  3. Убедитесь, что это действительно окно, о котором я забочусь:
    • Если это процесс, в котором находится мой плагин
    • И если класс имеет правильный тип
    • И если в фокусе правильное приложение (в случае нескольких приложений)
  4. Отправьте WM_DESTROY в созданное окно и вместо этого создайте мое собственное окно на его позиции

Как это звучит? Предполагая, что действительно нет API для обработки всплывающих подсказок, есть ли более простой способ для того, что мне нужно?

Спасибо!

P.S. Помечен как C ++ / C #, как я намереваюсь написать на этих двух языках (C ++ для общесистемного хука, C # для всего остального)

Ответы [ 2 ]

2 голосов
/ 05 декабря 2010

Если вы знаете тип окна, которое хотите заблокировать, вы можете просто создать его подкласс и обработать уничтожение в своем собственном WndProc. Используйте GetClassLongPtr () с GCL_WNDPROC в классе всплывающей подсказки, используйте SetClassLongPtr () с GCL_WNDPROC, чтобы установить свой собственный WndProc, и вызовите DestroyWindow () для WM_CREATE и назовите старый WndProc для остальных ..

0 голосов
/ 03 декабря 2010

Это не сработает. Подумайте о представлении приложения, которое вы заменяете всплывающими подсказками, и предположите, что вы можете сказать ему об уничтожении окон. Что произойдет, когда приложение решит, что оно должно закрыть всплывающую подсказку? У него нет дескриптора вашего нового окна, у него есть дескриптор старого окна, которое вы уничтожили. Время что-то пошло не так.

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

...