2009-03-04 30 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

相关问题