2010-03-30 123 views
8

我一直在努力改變工具提示的文本,該文本出現在窗體的主標題欄上的按鈕上。覆蓋標題欄按鈕的工具提示文本(關閉,最大化,最小化,幫助)

簡而言之,我們利用了Windows Forms的「幫助」按鈕來實現其他目的。這工作正常。問題在於,將鼠標懸停在該按鈕上時,會出現一個「幫助」工具提示,這對於應用程序沒有任何意義。

理想情況下,會有一些方法來改變我的應用程序的工具提示的文本;然而,在這一點上,我會滿意的只是找到一種方法來完全禁用工具提示。

我知道你可以通過修改註冊表中的'UserPreferencesMask'鍵來禁用整個操作系統的工具提示,但是我真的很喜歡這種方式來影響我的應用程序。

理想情況下,有一些方法可以用託管代碼實現,但我不會反對鏈接到Windows API等。

感謝您解決此問題的任何建議!

回答

1

作爲解決方法,您可以不使用幫助按鈕,而是:添加您的自定義按鈕。

雖然this sample不是很完美,但它顯示了你的想法。

+0

我肯定會推薦避免改變標準系統設施的用途。我可以想象這會導致輔助功能問題,特別是對於使用輔助軟件的用戶。 – eftpotrm 2010-04-06 16:26:25

+0

該解決方案並不能真正滿足我的需求。我們使用第三方庫(DevExpress)來允許對WinForms組件進行蒙皮處理。在這種情況下繪製的按鈕只是一個平面窗口按鈕。此外,它似乎有一些不好的閃爍問題和重繪問題。 – Tim 2010-04-07 14:05:44

+0

您共享的示例應用程序在Windows 7操作系統中運行不正常,我的意思是,如果您有任何其他想法,它會在Windows 7中消失,那麼您可以在此分享它嗎?提前致謝。 – SharpUrBrain 2010-12-24 13:23:29

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; 

但是,當工具提示與標題欄按鈕關聯時存在兩個問題。

  1. 我無法通過使用FindWindow獲取關閉按鈕的工具提示(nil,'Close');
  2. 如果我們能夠獲得句柄,我們需要一個聰明的地方來編寫代碼 - 我們不希望它在一個計時器中。 OnHint(在Delphi中 - 所有原生Win32應用程序中都存在類似的事件)可能僅適用於客戶端控件。有人可能會使用WM_NC *消息推斷標題欄工具提示何時顯示。
相關問題