3

我正在尝试在 Windows“将文件另存为...”对话框的“保存”按钮上设置文本。

我已经设置了钩子,收到了消息,找到了按钮(注意,如果我调用“ GetWindowText()”,我会看到“&Save”,所以我知道它是正确的按钮)。

接下来我使用“ 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"
  }
}
4

3 回答 3

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);
}
于 2009-03-05T16:11:32.033 回答
0

您可能需要在设置文本后重新绘制窗口。

设置文本后尝试调用 UpdateWindow()。

于 2009-03-04T19:59:33.847 回答
0

使用 CDM_SETCONTROLTEXT 消息来设置文本而不是直接乱用 SetWindowText,即

SendMessage(hwnd, CDM_SETCONTROLTEXT, IDOK, L"Testing");

http://msdn.microsoft.com/en-us/library/ms646960(VS.85).aspx有更多关于自定义打开/保存对话框

于 2009-03-04T20:13:23.330 回答