Переопределите текст всплывающей подсказки для кнопок Titlebar (Близко, Максимизируйте, Минимизируйте, Справка),

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

Короче говоря мы использовали кнопку 'Help' для Windows Forms, чтобы иметь некоторую другую цель. Это хорошо работает. Проблема - то, что при парении мыши над той кнопкой, подсказка 'Справки' появляется, который не имеет никакого смысла для приложения.

Идеально, был бы некоторый способ изменить текст той подсказки для моего приложения; однако, в этой точке я был бы удовлетворен, просто найдя способ отключить подсказки в целом.

Я знаю, что можно отключить подсказки для всей ОС путем изменения ключа 'UserPreferencesMask' regedit, но я действительно хотел бы способ иметь это единственное влияние мое приложение.

Снова, идеально был бы некоторый способ сделать это с управляемым кодом, но я не буду настроен против соединения в Windows API и т.п.

Спасибо за любые предложения для того, чтобы решить этот вопрос!

8
задан Tim 30 March 2010 в 21:45
поделиться

2 ответа

Это чрезвычайно интересный вопрос. Первой моей идеей было изменить системное меню с помощью GetSysMenu. Я попытался удалить и переименовать пункт «Закрыть», но всплывающая подсказка кнопки «Закрыть» не изменилась. Затем я попытался захватить HWND окна всплывающей подсказки, но мне это не удалось. Если я позволю форме (я работаю в Delphi) отображать всплывающую подсказку с именем "Test", я могу получить ее HWND с помощью FindWindow (nil, 'Test'), а затем я могу отправить ей сообщение WM_CLOSE.

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

procedure TForm1.Timer1Timer(Sender: TObject);
var
  h: HWND;
begin
  h := FindWindow(nil, 'Test');
  if h <> 0 then
    SendMessage(h, WM_CLOSE, 0, 0);
end;

Однако возникают две проблемы, когда всплывающая подсказка связана с кнопками строки заголовка.

  1. Мне не удалось получить дескриптор всплывающей подсказки для кнопки «Закрыть» с помощью FindWindow (nil, 'Close');
  2. Если мы сможем получить дескриптор, нам понадобится умное место для написания кода - мы не хотим, чтобы это было в таймере. OnHint (в Delphi - аналогичные события существуют во всех собственных приложениях Win32), вероятно, будет работать только для клиентских элементов управления. Можно использовать сообщения WM_NC *, чтобы определить, когда должна отображаться всплывающая подсказка в строке заголовка.
0
ответ дан 6 December 2019 в 02:24
поделиться

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

Хотя этот образец не так совершенен, но он показывает вам идею.

1
ответ дан 6 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

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