Re[2]: UP
От: Conr Россия  
Дата: 28.09.06 15:28
Оценка: 12 (1)
Здравствуйте, remark, Вы писали:

R>Здравствуйте, checkpsn, Вы писали:


C>>Подскажите, плз. как получить тексты надписей, которые отображаются на кнопках при вызове стандартного MessageBox. Например, для русской версии Windows:

C>>IDYES — "Да", IDNO — "Нет", IDCANCEL — "Отмена", и т.д.
C>>Замечание: без реального вызова MessageBox.

R>Такая же проблема.

R>Ни у кого за год идей не появилось?

Сходу придумалось это — проверил, работает вроде кругом.

enum
{
    sOk = 800,
    sCancel,
    sAbort,
    sRetry,
    sIgnore,
    sYes,
    sNo,
    sClose,
    sHelp,
    sTryAgain,
    sContinue
};

HMODULE hUser32 = ::GetModuleHandle("user32");
TCHAR buffer[64];
::LoadString(hUser32,sTryAgain,buffer,64);
Re[4]: UP
От: Conr Россия  
Дата: 29.09.06 08:26
Оценка: 6 (1)
Здравствуйте, remark, Вы писали:

C>>Сходу придумалось это — проверил, работает вроде кругом.


C>>
C>>enum
C>>{
C>>    sOk = 800,
C>>    sCancel,
C>>    sAbort,
C>>    sRetry,
C>>    sIgnore,
C>>    sYes,
C>>    sNo,
C>>    sClose,
C>>    sHelp,
C>>    sTryAgain,
C>>    sContinue
C>>};

C>>HMODULE hUser32 = ::GetModuleHandle("user32");
C>>TCHAR buffer[64];
C>>::LoadString(hUser32,sTryAgain,buffer,64);
C>>



R>Вот это примерно типа того, чего хотелось бы... но попахивает чёрной магией

R>Это документировано? Откуда 800? Откуда "user32"? На каких ОС работает? Есть гарантии, что не изменится?
Нее, это магия белая, пусть и недокументированная 800 — это ID из StringTable, которая лежит в user32.dll — стандартной dll, присутствующей на всех системах, начиная с win95 + она всегда загруженная (в общем случае). Насчет изменится — в висте работает, проверил


R>
Re[3]: UP
От: NightBlade Россия  
Дата: 29.09.06 09:48
Оценка: 6 (1)
а ты пробовал с английской версией ОС под русским MUI?
я, наример, не представляю, как MUI в систему интегрируется так, чтобы еще и переключать языки можно было. по-хорошему надо отдельную DLL с языковыми ресурсами подключать, но как это у мелкомягких решено — не разбирался. если с DLL, то ты рискуешь от user32 получить строки на исходном языке системы
Все вопросы на nightblade@inbox.ru
Re[4]: UP
От: Conr Россия  
Дата: 29.09.06 10:37
Оценка: 6 (1)
Здравствуйте, NightBlade, Вы писали:

NB>а ты пробовал с английской версией ОС под русским MUI?

NB>я, наример, не представляю, как MUI в систему интегрируется так, чтобы еще и переключать языки можно было. по-хорошему надо отдельную DLL с языковыми ресурсами подключать, но как это у мелкомягких решено — не разбирался. если с DLL, то ты рискуешь от user32 получить строки на исходном языке системы
Про это я сразу подумал. Но я же писал, что придумалось сходу А вот, что получилось после небольших размышлений:
    HMODULE hUser32 = GetModuleHandle("user32");

    typedef LPWSTR(WINAPI *MB_GetString_type)(DWORD);
    MB_GetString_type pfnMB_GetString = (MB_GetString_type)::GetProcAddress(hUser32,_T("MB_GetString"));
    LPWSTR retryStr = pfnMB_GetString(IDRETRY-1);


в pfnMB_GetString нужно передавать идентификатор кнопки минус еденица, то есть для получения текста для IDOK передать нужно (IDOK-1)
Вот только не уверен, что это будет работать на win9x, но думаю сейчас это уже некритично. на 2003, XP c MUI и висте работает.
Re[2]: UP
От: Carc Россия http://www.amlpages.com/home.php
Дата: 28.09.06 17:47
Оценка: +1
Здравствуйте, remark, Вы писали:

R>Здравствуйте, checkpsn, Вы писали:


C>>Подскажите, плз. как получить тексты надписей, которые отображаются на кнопках при вызове стандартного MessageBox. Например, для русской версии Windows:

C>>IDYES — "Да", IDNO — "Нет", IDCANCEL — "Отмена", и т.д.
C>>Замечание: без реального вызова MessageBox.

R>Такая же проблема.

R>Ни у кого за год идей не появилось?

R>

Есть тут статья "MessageBox и немного фантазии", ставим хук и поехали из хуковой процедуры
HWND hwnd=GetDkgIten(hwndMsgBox,IDOK);
TCHAR sz[51];
GetWindowText(hwnd,sz,50);
Aml Pages Home
Надписи на кнопках в MessageBox
От: checkpsn  
Дата: 23.03.05 14:33
Оценка:
Подскажите, плз. как получить тексты надписей, которые отображаются на кнопках при вызове стандартного MessageBox. Например, для русской версии Windows:
IDYES — "Да", IDNO — "Нет", IDCANCEL — "Отмена", и т.д.
Замечание: без реального вызова MessageBox.
Re: UP
От: remark Россия http://www.1024cores.net/
Дата: 28.09.06 15:03
Оценка:
Здравствуйте, checkpsn, Вы писали:

C>Подскажите, плз. как получить тексты надписей, которые отображаются на кнопках при вызове стандартного MessageBox. Например, для русской версии Windows:

C>IDYES — "Да", IDNO — "Нет", IDCANCEL — "Отмена", и т.д.
C>Замечание: без реального вызова MessageBox.

Такая же проблема.
Ни у кого за год идей не появилось?


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: UP
От: remark Россия http://www.1024cores.net/
Дата: 29.09.06 07:55
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, remark, Вы писали:


R>>Здравствуйте, checkpsn, Вы писали:


C>>>Подскажите, плз. как получить тексты надписей, которые отображаются на кнопках при вызове стандартного MessageBox. Например, для русской версии Windows:

C>>>IDYES — "Да", IDNO — "Нет", IDCANCEL — "Отмена", и т.д.
C>>>Замечание: без реального вызова MessageBox.

R>>Такая же проблема.

R>>Ни у кого за год идей не появилось?

R>>

C>Есть тут статья "MessageBox и немного фантазии", ставим хук и поехали из хуковой процедуры
C>HWND hwnd=GetDkgIten(hwndMsgBox,IDOK);
C>TCHAR sz[51];
C>GetWindowText(hwnd,sz,50);

По воробьям из пушки.
Хочется как-то так:
CString ok = LoadString(IDOK);


Примерно как здесь
Автор: Conr
Дата: 28.09.06



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: UP
От: remark Россия http://www.1024cores.net/
Дата: 29.09.06 07:58
Оценка:
Здравствуйте, Conr, Вы писали:

C>Здравствуйте, remark, Вы писали:


R>>Здравствуйте, checkpsn, Вы писали:


C>>>Подскажите, плз. как получить тексты надписей, которые отображаются на кнопках при вызове стандартного MessageBox. Например, для русской версии Windows:

C>>>IDYES — "Да", IDNO — "Нет", IDCANCEL — "Отмена", и т.д.
C>>>Замечание: без реального вызова MessageBox.

R>>Такая же проблема.

R>>Ни у кого за год идей не появилось?

C>Сходу придумалось это — проверил, работает вроде кругом.


C>
C>enum
C>{
C>    sOk = 800,
C>    sCancel,
C>    sAbort,
C>    sRetry,
C>    sIgnore,
C>    sYes,
C>    sNo,
C>    sClose,
C>    sHelp,
C>    sTryAgain,
C>    sContinue
C>};

C>HMODULE hUser32 = ::GetModuleHandle("user32");
C>TCHAR buffer[64];
C>::LoadString(hUser32,sTryAgain,buffer,64);
C>



Вот это примерно типа того, чего хотелось бы... но попахивает чёрной магией
Это документировано? Откуда 800? Откуда "user32"? На каких ОС работает? Есть гарантии, что не изменится?



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.