На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Чужой SysListView32, , надо выделить элемент
    Ну, насчёт надёжности я б не сказал.
    Попробуй получить название класса окна, которому отправляешь сообщение. Должно быть SysListView32, или типа того.
    А сначала посмотри при помощи Spy++, что там за класс.
      Цитата Олег М @
      У тебя хоть какие-то сообщения работают? Попробуй получить выделенный элемент.
      Да, всякие тестовые работают (смена цвета, опрос номера и т.д.).

      Цитата Славян @
      1.Открываю ГОСТ-диалог "открыть файл". Узнаю его HWND.
      Имелось ввиду, что узнаю HWND списка файлов, само собой, кой является SysListView32.

      Добавлено
      Цитата Олег М @
      Попробуй получить название класса окна, которому отправляешь сообщение. Должно быть SysListView32, или типа того. А сначала посмотри при помощи Spy++, что там за класс.
      Да, бесспорно это было проверено для надёжности и гарантии, что всё в нужном списке происходит, с самого начала. :)

      Добавлено
      Цитата Олег М @
      Ну, насчёт надёжности я б не сказал.
      Хм... а отчего? Что именно смущает, если смущает?
        Цитата Славян @
        Ставлю курсор на 1..2-й элемент (для надёжности).


        Цитата
        If set to -1, the selection mark is removed.

        А это не о том?
        Сообщение отредактировано: Alexei -
          А как ты посылаешь сообщение? Там же надо отправлять в другой процесс указатель на LVITEM.

          Добавлено
          У меня ощущение, что там маршаллинг для этих сообщений как-то не так делается. Если делается вообще.
            Цитата Alexei @
            А это не о том?
            Не о том. Я ж нигде никакие -1 не использую.

            Цитата Олег М @
            А как ты посылаешь сообщение? Там же надо отправлять в другой процесс указатель на LVITEM.
            Не, ничего не надо отправлять в никакой другой процесс. Я ж виндовой системе говорю какой HWND использую, вызывая "ListView_SetItemState( hwnd, ...", а ей ужо передаю указатель на LVITEMW, кой, конечно, у меня в процессе, но это уже её дело как разрулить сие. С этим она, впрочем, весьма успешно справляется, но вот некоторые косяки (о коих мы здесь и пишем) и происходят.
              Цитата Олег М @
              У меня ощущение, что там маршаллинг для этих сообщений как-то не так делается.

              Так и есть. Для этих сообщений ты не можешь передать указатель в другой процесс. Нужно его предварительно подготовить. Нашел вот такой код, на C# правда, но всё равно

              ExpandedWrap disabled
                        Win32.LVITEM lvi = new Win32.LVITEM();
                        lvi.mask = Win32.LVIF_STATE;
                        lvi.stateMask = Win32.LVIS_FOCUSED | Win32.LVIS_SELECTED;
                        lvi.state = Win32.LVIS_FOCUSED | Win32.LVIS_SELECTED;
                        lvi.cchTextMax = 0;
                        lvi.iImage = 0;
                 
                        IntPtr ptrLvi = Marshal.AllocHGlobal(Marshal.SizeOf(lvi));
                        Marshal.StructureToPtr(lvi, ptrLvi, false);
                 
                        int ret = Win32.SendMessage(_hwnd, Win32.LVM_SETITEMSTATE, new IntPtr(itemIdx), ptrLvi).ToInt32();
                        Marshal.FreeHGlobal(ptrLvi);
                 
                        if (ret == 0)
                        {
                            throw new Exception("Selecting the item has failed");
                        }

              https://sites.google.com/site/jozsefbekes/H...other-processes
                Да мне же и не надо передавать (в простом случае) никакой указатель! Чистый WinAPI ж использую:

                int N=4;
                ::SendMessageW( hwnd, LVM_SETSELECTIONMARK, 0, N); // установка
                int i = ::SendMessageW( hwnd, LVM_GETSELECTIONMARK, 0, 0); // проверка

                ListView_SetItemState( hwnd, N, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); // не работающее место

                П.С. сорри за не Си-кодировку, скрипты выключены.
                  Цитата Славян @
                  Да мне же и не надо передавать (в простом случае) никакой указатель! Чистый WinAPI ж использую:

                  ListView_SetItemState - это макрос. Который посылает сообщение LVM_SETITEMSTATE. У которого второй параметр - указатель на LVITEM.
                  ExpandedWrap disabled
                            LVITEM lvi = {0};
                            lvi.mask = LVIF_STATE;
                            lvi.state = lvi.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
                            lvi.iItem = iItem;
                                    
                            ::SendMessage(hListView, LVM_SETITEMSTATE, iItem, (LPARAM)&lvi);
                    Да, понимаю, но... крайние сомнения, что что-то там с памятью. ОС вполне обязана понимать, что чужой процесс посылает что-то, а потому обязана разруливать и я убеждён, что разруливает. Впрочем, огромными тонкостями не владею. Надо экспериментнуть как-то бы...
                      Цитата Славян @
                      ОС вполне обязана понимать, что чужой процесс посылает что-то, а потому обязана разруливать и я убеждён, что разруливает

                      Нет, не обязана. Она разруливает определённые сообщения, типа WM_COPYDATA, ну и всё. Сообщения к контролам - нет.

                      Добавлено
                      Цитата Олег М @
                      Надо экспериментнуть как-то бы...

                      Собственно, ты и экспериментируешь. У меня в 10-й винде вообще оба приложения свалились. Что, собственно, и является нормальным поведением в данном случае.
                        Цитата Славян @
                        ОС вполне обязана понимать, что чужой процесс посылает что-то, а потому обязана разруливать и я убеждён, что разруливает. Впрочем, огромными тонкостями не владею. Надо экспериментнуть как-то бы...

                        Посмотри тут и тут.
                        Ещё ссылка
                        ---
                        Кроме того, неплохо было бы убедиться, что всё манипуляции с контролом правильно работают
                        в "своём" приложении. У меня вот проблема - всё вроде работает, но визуальных изменений в контроле
                        не происходит. Чтобы увидеть результат, надо контрол за заголовок подёргать... :huh:
                        ---
                        Всё оказалось просто - чтобы увидеть результат, надо после акции сделать " ::SetFocus(hListView);"
                        Сообщение отредактировано: ЫукпШ -
                          Цитата Славян @
                          ОС вполне обязана понимать, что чужой процесс посылает что-то, а потому обязана разруливать и я убеждён, что разруливает.

                          Нет. См.ремарки к SendMessage:
                          Цитата
                          The system only does marshalling for system messages (those in the range 0 to (WM_USER-1)). To send other messages (those >= WM_USER) to another process, you must do custom marshalling.

                          Поэтому тебе просто "повезло", что адрес\указатель твоего LVITEM оказался валидным в чужом приложении. Иначе словил бы AV и сам понял, что так делать нельзя
                          Сообщение отредактировано: leo -
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0375 ]   [ 16 queries used ]   [ Generated: 26.04.24, 20:49 GMT ]