8

フォームのメインタイトルバーのボタンに表示されるツールチップのテキストを変更しようとしてきました。

一言で言えば、Windowsフォームの[ヘルプ]ボタンを利用して、他の目的を持っています。これは正常に機能しています。問題は、そのボタンの上にマウスを置くと、「ヘルプ」ツールチップが表示されることです。これは、アプリケーションにとって意味がありません。

理想的には、アプリケーションのツールチップのテキストを変更する方法があります。ただし、この時点では、ツールチップを完全に無効にする方法を見つけるだけで満足できます。

regeditの「UserPreferencesMask」キーを変更することでOS全体のツールチップを無効にできることは知っていますが、これを自分のアプリケーションにのみ影響させる方法が本当に必要です。

繰り返しになりますが、理想的にはマネージコードでこれを行う方法がありますが、WindowsAPIなどにリンクすることに反対することはありません。

この問題を解決するための提案をありがとう!

4

2 に答える 2

1

回避策として、代わりにヘルプ ボタンを使用しないでください: カスタム ボタンを追加します。

このサンプルは完璧ではありませんが、アイデアを示しています。

于 2010-03-30T22:15:33.393 に答える
0

これは非常に興味深い質問です。私の最初のアイデアは、GetSysMenu を使用してシステム メニューを変更することでした。「閉じる」項目の削除と名前変更の両方を試みましたが、閉じるボタンのツールチップは変わりませんでした。次に、ツールチップ ウィンドウの HWND をキャプチャしようとしましたが、成功しませんでした。フォーム (私は Delphi で作業しています) に "Test" という名前のツールチップを表示させると、FindWindow(nil, 'Test') でその HWND を取得でき、それから SendMessage 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;

ただし、ツールヒントがタイトル バー ボタンに関連付けられている場合、2 つの問題があります。

  1. FindWindow(nil, 'Close'); を使用して [閉じる] ボタンのツールチップのハンドルを取得できませんでした。
  2. ハンドルを取得できる場合は、コードを書くスマートな場所が必要です。タイマーには入れたくありません。OnHint (Delphi では、同様のイベントがすべてのネイティブ Win32 アプリに存在します) は、おそらくクライアント コントロールに対してのみ機能します。WM_NC* メッセージを使用して、タイトル バーのツールチップがいつ表示されるかを推測できます。
于 2010-03-31T12:09:38.087 に答える