Переопределить текст всплывающей подсказки для кнопок заголовка (Закрыть, Развернуть, Свернуть, Справка) - PullRequest
8 голосов
/ 31 марта 2010

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

В двух словах, мы использовали кнопку «Справка» для Windows Forms, чтобы иметь какую-то другую цель. Это работает нормально. Проблема заключается в том, что при наведении указателя мыши на эту кнопку появляется всплывающая подсказка «Справка», которая не имеет смысла для приложения.

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

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

Опять же, в идеале был бы какой-то способ сделать это с помощью управляемого кода, но я бы не стал возражать против ссылки на Windows API или тому подобное.

Спасибо за любые предложения по решению этой проблемы!

Ответы [ 2 ]

1 голос
/ 31 марта 2010

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

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

0 голосов
/ 31 марта 2010

Это чрезвычайно интересный вопрос. Моей первой идеей было изменить системное меню, используя 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 * для определения необходимости отображения всплывающей подсказки в строке заголовка.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...