2009-03-04 61 views
3

我試圖設置Windows的「保存文件爲...」對話框的「保存」按鈕上的文本。如果我打電話「GetWindowText()」我看到「&保存」,所以我知道這是正確的按鈕)。我已經設置了鉤子,收到消息,找到了按鈕(如果我打電話「GetWindowText()」我看到「&保存」如何設置Windows文件對話框中「保存」按鈕上的文本?

接下來我使用「SetWindowText()」(並且稱爲「GetWindowText()」來檢查它 - 文本是否正確)更改了文本。

但是...該按鈕仍然說「保存」。

我可以使用完全相同的代碼更改「取消」按鈕 - 沒問題。 「保存」按鈕有什麼特別之處?我該如何改變它。

碼(爲它的價值):

static UINT_PTR CALLBACK myHook(HWND hwnd, UINT msg, WPARAM, LPARAM) 
{ 
    if (msg == WM_INITDIALOG) { 
    wchar_t temp[100]; 
    HWND h = GetDlgItem(GetParent(hwnd),IDOK); 
    GetWindowTextW(h,temp,100);  // temp=="&Save" 
    SetWindowTextW(h,L"Testing"); 
    GetWindowTextW(h,temp,100);  // temp=="Testing" 
    } 
} 
+0

根據這些信息,聽起來好像按鈕正在WM_INITDIALOG之後進行更改。沒有內置的擴展機制,允許您自定義對話框的各個方面(不使用掛鉤)? – jdigital 2009-03-04 20:04:04

+0

我試着在每次調用回調函數時查看按鈕的文本(在WM_INITDIALOG之後有相當多的調用...)。文本總是說「測試」(但它與顯示內容不一樣)。 – 2009-03-04 22:17:38

回答

1

我終於做到了工作....

我很肯定有一些有趣的事情發生在「保存」按鈕上,但是這個代碼會把它提交到投稿中:

// I replace the dialog's WindowProc with this 
static WNDPROC oldProc = NULL; 
static BOOL CALLBACK buttonSetter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    // Set the button text on every window redraw.... 
    if (msg == WM_ERASEBKGND) { 
     SetDlgItemTextW(hwnd,IDOK,L"OK"); 
    } 
    return oldProc(hwnd, msg, wParam, lParam); 
}; 

// This is the callback for the GetWriteName hook 
static UINT_PTR CALLBACK GWNcallback(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    HWND dlg = GetParent(hwnd); 
    if (msg == WM_INITDIALOG) { 
     oldProc = (WNDPROC)GetWindowLongPtr(dlg, GWL_WNDPROC); 
     if (oldProc !=0) { 
      SetWindowLongPtr(dlg, GWL_WNDPROC, (LONG)buttonSetter); 
     } 
    } 
    // We need extra redraws to make our text appear... 
    InvalidateRect(dlg,0,1); 
} 
0

你可能需要設置文本後重繪窗口。

嘗試在設置文本後調用UpdateWindow()。

+0

不,我試過了。 – 2009-03-04 21:56:09

相關問題