Обновить окно имея его handle
От: Аноним  
Дата: 09.09.10 14:43
Оценка:
Всем доброго времени суток!
Столкнулся тут с проблемой, что при изменении Title у окна, он меняется, то есть отрисовывается, только после его закрытия\открытия.

Вначале я получаю handle на нужное мне окно с помощою функции FindWindowEx.
childHandle = FindWindowEx(hDesktop, IntPtr.Zero, "TMsgForm", IntPtr.Zero);

После этого меняю Title для полученного окна с помощью функции SetWindowText.
SetWindowText(lPtr[i], title);

И у меня Title для окна меняется на нужный мне только после того, как я руками закрываю\открываю окно.
Пробовал с помощью функции RedrawWindow, но она не помогает, пробовал открыть восстановать окно с помощью CloseWindow\ShowWindo, пытался посмотреть какой-нибудь SendMessage WM_.. но ничего похожего не нашёл. Может быть кто в курсе, как сделать так, чтобы сразу после изменения Title для окна он менялся, и не надо было окно перерисовывать руками, а сделать это программно?

Спасибо
Re: Обновить окно имея его handle
От: Pavel Dvorkin Россия  
Дата: 09.09.10 14:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем доброго времени суток!

А>Столкнулся тут с проблемой, что при изменении 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.

Это вроде как не совсем то ( у тебя как будто не чайлд), но все же попробуй.
With best regards
Pavel Dvorkin
Re[2]: Обновить окно имея его handle
От: Lexus_  
Дата: 10.09.10 13:39
Оценка:
Здравствуйте, 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);
        }
Re[3]: Обновить окно имея его handle
От: Lexus_  
Дата: 10.09.10 13:40
Оценка:
Здравствуйте, Lexus_, Вы писали:

L_>Вообще у меня child окно, но это способ через SendMessage WM_SETTEXT не помог, всё осталось так же как и описано, Title для окна меняется, а перерисовывается только когда я закрою\открою окно. Делал так:


Забыл в первом посте залогиниться.
Re: Обновить окно имея его handle
От: kero Россия  
Дата: 10.09.10 13:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пробовал с помощью функции RedrawWindow, но она не помогает


А с чего ей помогать, у вас же НЕ-клиентская область
Т.е. тогда уж пробуйте стандартное SetWindowPos(SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_FRAMECHANGED)
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[3]: Обновить окно имея его handle
От: Pavel Dvorkin Россия  
Дата: 10.09.10 14:39
Оценка:
Здравствуйте, 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.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.