Всем доброго времени суток!
Столкнулся тут с проблемой, что при изменении Title у окна, он меняется, то есть отрисовывается, только после его закрытия\открытия.
Вначале я получаю handle на нужное мне окно с помощою функции FindWindowEx.
childHandle = FindWindowEx(hDesktop, IntPtr.Zero, "TMsgForm", IntPtr.Zero);
После этого меняю Title для полученного окна с помощью функции SetWindowText.
SetWindowText(lPtr[i], title);
И у меня Title для окна меняется на нужный мне только после того, как я руками закрываю\открываю окно.
Пробовал с помощью функции RedrawWindow, но она не помогает, пробовал открыть восстановать окно с помощью CloseWindow\ShowWindo, пытался посмотреть какой-нибудь SendMessage WM_.. но ничего похожего не нашёл. Может быть кто в курсе, как сделать так, чтобы сразу после изменения Title для окна он менялся, и не надо было окно перерисовывать руками, а сделать это программно?
Спасибо
Здравствуйте, Аноним, Вы писали:
А>Всем доброго времени суток!
А>Столкнулся тут с проблемой, что при изменении Title у окна, он меняется, то есть отрисовывается, только после его закрытия\открытия.
А>Вначале я получаю handle на нужное мне окно с помощою функции FindWindowEx.
А>childHandle = FindWindowEx(hDesktop, IntPtr.Zero, "TMsgForm", IntPtr.Zero);
А>После этого меняю Title для полученного окна с помощью функции SetWindowText.
А>SetWindowText(lPtr[i], title);
Хм... Проверять некогда.
To set the text of a control in another process, send the WM_SETTEXT message directly instead of calling SetWindowText.
Это вроде как не совсем то ( у тебя как будто не чайлд), но все же попробуй.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Хм... Проверять некогда.
PD>To set the text of a control in another process, send the WM_SETTEXT message directly instead of calling SetWindowText.
PD>Это вроде как не совсем то ( у тебя как будто не чайлд), но все же попробуй.
Вообще у меня child окно, но это способ через SendMessage WM_SETTEXT не помог, всё осталось так же как и описано, Title для окна меняется, а перерисовывается только когда я закрою\открою окно. Делал так:
[DllImport("User32.dll")]
public static extern Int32 SendMessage(
IntPtr hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
[MarshalAs(UnmanagedType.LPStr)] string lParam); // second message parameter
private int WM_SETTEXT = 0x000C;
private void FuncSetWindowText(IntPtr hWnd, string text)
{
//WM_SETTEXT = 0x000C;
SendMessage(hWnd, WM_SETTEXT, 0, text);
}
Здравствуйте, Аноним, Вы писали:
А>Пробовал с помощью функции RedrawWindow, но она не помогает
А с чего ей помогать, у вас же НЕ-клиентская область
Т.е. тогда уж пробуйте стандартное SetWindowPos(SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|
SWP_FRAMECHANGED)
Здравствуйте, Lexus_, Вы писали:
L_>Вообще у меня child окно, но это способ через SendMessage WM_SETTEXT не помог, всё осталось так же как и описано, Title для окна меняется, а перерисовывается только когда я закрою\открою окно. Делал так:
Делал вроде правильно.
Совет kero попробуй сначала, может быть, поможет. Если нет — читай дальше.
Вообще-то ситуация такая. Надеюсь, ты принципы Win API знаешь, если что-то непонятно — спроси.
Шлем окну сообщение. Ну получило оно его, а дальше ?
А дальше все зависит от того, что оно с ним делает.
Вариант 1. Вызывает DefWindowProc. Та, скорее всего, перерисует заголовок. Во всяком случае должна. Я так менял заголовок основному окну в WPF приложении из другого консольного приложения, и здесь этот пример публиковал. Увы, не могу найти.
Вариант 2. Обрабатывает само. Тут у него масса возможнстей. Например, оно может просто запомнить эту строку, чтобы потом ее использовать. Когда — потом ? А черт его знает, когда захочет, тогда и будет.
case WM_SETTTEXT:
// сохранить строку где-то
case не_знаю_что :
// установить заголовок.
Тем более, что у тебя чайлд, да еще какого-то неизвестного мне класса.
Что могу посоветовать.
Запусти Spy++, найди это окно и установи ему заголовок из твоего приложения. Посмотри, приходит ли WM_SETTEXT и что потом еще приходит.
Ты писал, что если вручную открыть/закрыть окно (свернуть/развернуть, я полагаю ?), то все срабатывает. Сделай это под Spy++ после того, как приказал установиться (пока что безуспешно) заголовку. Опять же посмотри , что при этом в Spy++ будет, какие сообщения. Там много мусора будет, его надо отфильтровать. Посмотри, нельзя ли послать ему какое-то из этих сообщений, поэкспериментируй. Будь аккуратен — не все сообщения можно слать, в частности, упаси тебя боже слать иные чем WM_SETTEXT сообщения, где есть указатель на что бы то ни было в lParam.