Трассировка WM кода в страку
От: Fortnum  
Дата: 28.10.10 07:48
Оценка:
Существуют какие-нибудь готовые решения для .NET, наподобие вот этого?

В принципе, можно и это портировать, но может быть уже есть что-нибудь более мощное, с большим числом кодов и авторазбором параметров, например?
Re: Трассировка WM кода в страку
От: _FRED_ Черногория
Дата: 28.10.10 08:27
Оценка: 6 (1)
Здравствуйте, Fortnum, Вы писали:

F>Существуют какие-нибудь готовые решения для .NET, наподобие вот этого?


F>В принципе, можно и это портировать, но может быть уже есть что-нибудь более мощное, с большим числом кодов и авторазбором параметров, например?


А что там сложного: находите объявления сообщений в виде enuma для дотнета (*), пишите IMessageFilter, конвертируете числовое значение сообщения в значение перечислителя и преобразуете его в строку.

* — например, на pinvoke или где-то на этом сайте видел большущий список.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Трассировка WM кода в страку
От: Fortnum  
Дата: 28.10.10 08:45
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А что там сложного: находите объявления сообщений в виде enuma для дотнета (*), пишите IMessageFilter, конвертируете числовое значение сообщения в значение перечислителя и преобразуете его в строку.

_FR>* — например, на pinvoke или где-то на этом сайте видел большущий список.

Да, вот такой список и был нужен. Теперь понятно, почему эти константы мне объявлять надо было в одном месте

Чтобы не создавать велосипед — вопрос с разбором параметров тем не менее остался открытым. Хочется видеть координаты окна в WM_MOVE, и т.п.
Re[2]: Трассировка WM кода в страку
От: Fortnum  
Дата: 28.10.10 09:00
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>пишите IMessageFilter


Кстати, протрассировать хочу окно WPF. Непонятно работает биндинг Left, Top, Width и Height. Мне надо установить Application Bar, ну и как только хэндл я получаю — в OnSourceInitialized я это делаю, регистрирую AppBar и задаю положение окну через прибинденные свойства ViewModel окна. Однако происходит что-то странное: в большинстве случаев все проходит нормально, но иногда, после того как я задаю положение окна в обработчике OnSourceInitialized, приходит потом WM_MOVE со старыми дефолтными координатами, т.е. с теми, с которыми окно имелось на момент вызова обработчика OnSourceInitialized. Причем WM_MOVE этот приходит уже в другом оконном цикле. Пытаюсь понять через refelctor, каким образом и зачем System.Windows.Window (иногда) приводит окно к первичным координатам, пока понять не могу. Может быть это и не сам System.Windows.Window это делает, т.к. в отладчике этот WM_MOVE с координатами, которые я не заказывал, после того как установил свои, приходит прямо из Dispatcher.Run()->..->Dispatcher.GetMessage()->...->Мой хук. Через PostMessage что ли.
Re[3]: Трассировка WM кода в страку
От: Fortnum  
Дата: 28.10.10 10:38
Оценка:
Здравствуйте, Fortnum, Вы писали:

F>иногда приходит потом WM_MOVE со старыми дефолтными координатами


О! Нашел в нете мою тему, именно для WPF:

I'm trying to create desktop toolbar window using SHAppBarMessage and Window class. I send NEW then QUERYPOS and SETPOS messages. Then I'm trying to set new position for a window (I tried Window Top, Left etc properties, MoveWindow and SetWindowPos functions) but after window position has changed Window receives WM_MOVE message with old coordinates and changes it's position back.


Но она без какого-либо решения. Разве что это, но это не решение

I figured it out -- you have to call SHAppBarMessageHelper.ABSetPos again some number of messages after RegisterBar. I called it the first time Window.ContentRendered is fired; that seems to work.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.