Как установить текст на кнопку «Сохранить» в диалоговом окне файлов Windows? - PullRequest
3 голосов
/ 04 марта 2009

Я пытаюсь установить текст в кнопке «Сохранить» диалогового окна «Сохранить файл как ...» в Windows.

Я настроил хук, получил сообщение, нашел кнопку (примечание. Если я позвоню "GetWindowText()", я вижу "& Сохранить", поэтому я знаю, что это правильная кнопка).

Затем я изменил текст, используя «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"
  }
}

Ответы [ 3 ]

1 голос
/ 05 марта 2009

Я наконец заставил это работать ....

Я почти уверен, что с кнопкой "Сохранить" происходит что-то смешное, но этот код преобразует его в отправку:

// 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 голосов
/ 04 марта 2009

Используйте сообщение CDM_SETCONTROLTEXT, чтобы установить текст, а не связываться напрямую с SetWindowText, т. Е.

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

http://msdn.microsoft.com/en-us/library/ms646960(VS.85).aspx содержит дополнительные сведения о настройке диалогов открытия / сохранения

0 голосов
/ 04 марта 2009

Возможно, вам нужно перерисовать окно после установки текста.

Попробуйте вызвать UpdateWindow () после установки текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...