Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.247.31] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Ну, насчёт надёжности я б не сказал.
Попробуй получить название класса окна, которому отправляешь сообщение. Должно быть SysListView32, или типа того. А сначала посмотри при помощи Spy++, что там за класс. |
Сообщ.
#17
,
|
|
|
Да, всякие тестовые работают (смена цвета, опрос номера и т.д.).
Имелось ввиду, что узнаю HWND списка файлов, само собой, кой является SysListView32. Добавлено Цитата Олег М @ Да, бесспорно это было проверено для надёжности и гарантии, что всё в нужном списке происходит, с самого начала. Попробуй получить название класса окна, которому отправляешь сообщение. Должно быть SysListView32, или типа того. А сначала посмотри при помощи Spy++, что там за класс. Добавлено Цитата Олег М @ Хм... а отчего? Что именно смущает, если смущает? Ну, насчёт надёжности я б не сказал. |
Сообщ.
#18
,
|
|
|
Цитата If set to -1, the selection mark is removed. А это не о том? |
Сообщ.
#19
,
|
|
|
А как ты посылаешь сообщение? Там же надо отправлять в другой процесс указатель на LVITEM.
Добавлено У меня ощущение, что там маршаллинг для этих сообщений как-то не так делается. Если делается вообще. |
Сообщ.
#20
,
|
|
|
Цитата Alexei @ Не о том. Я ж нигде никакие -1 не использую.А это не о том? Цитата Олег М @ Не, ничего не надо отправлять в никакой другой процесс. Я ж виндовой системе говорю какой HWND использую, вызывая "ListView_SetItemState( hwnd, ...", а ей ужо передаю указатель на LVITEMW, кой, конечно, у меня в процессе, но это уже её дело как разрулить сие. С этим она, впрочем, весьма успешно справляется, но вот некоторые косяки (о коих мы здесь и пишем) и происходят. А как ты посылаешь сообщение? Там же надо отправлять в другой процесс указатель на LVITEM. |
Сообщ.
#21
,
|
|
|
Цитата Олег М @ У меня ощущение, что там маршаллинг для этих сообщений как-то не так делается. Так и есть. Для этих сообщений ты не можешь передать указатель в другой процесс. Нужно его предварительно подготовить. Нашел вот такой код, на C# правда, но всё равно 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 |
Сообщ.
#22
,
|
|
|
Да мне же и не надо передавать (в простом случае) никакой указатель! Чистый 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); // не работающее место П.С. сорри за не Си-кодировку, скрипты выключены. |
Сообщ.
#23
,
|
|
|
Цитата Славян @ Да мне же и не надо передавать (в простом случае) никакой указатель! Чистый WinAPI ж использую: ListView_SetItemState - это макрос. Который посылает сообщение LVM_SETITEMSTATE. У которого второй параметр - указатель на LVITEM. 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); |
Сообщ.
#24
,
|
|
|
Да, понимаю, но... крайние сомнения, что что-то там с памятью. ОС вполне обязана понимать, что чужой процесс посылает что-то, а потому обязана разруливать и я убеждён, что разруливает. Впрочем, огромными тонкостями не владею. Надо экспериментнуть как-то бы...
|
Сообщ.
#25
,
|
|
|
Цитата Славян @ ОС вполне обязана понимать, что чужой процесс посылает что-то, а потому обязана разруливать и я убеждён, что разруливает Нет, не обязана. Она разруливает определённые сообщения, типа WM_COPYDATA, ну и всё. Сообщения к контролам - нет. Добавлено Цитата Олег М @ Надо экспериментнуть как-то бы... Собственно, ты и экспериментируешь. У меня в 10-й винде вообще оба приложения свалились. Что, собственно, и является нормальным поведением в данном случае. |
Сообщ.
#26
,
|
|
|
Цитата Славян @ ОС вполне обязана понимать, что чужой процесс посылает что-то, а потому обязана разруливать и я убеждён, что разруливает. Впрочем, огромными тонкостями не владею. Надо экспериментнуть как-то бы... Посмотри тут и тут. Ещё ссылка --- Кроме того, неплохо было бы убедиться, что всё манипуляции с контролом правильно работают в "своём" приложении. У меня вот проблема - всё вроде работает, но визуальных изменений в контроле не происходит. Чтобы увидеть результат, надо контрол за заголовок подёргать... --- Всё оказалось просто - чтобы увидеть результат, надо после акции сделать " ::SetFocus(hListView);" |
Сообщ.
#27
,
|
|
|
Цитата Славян @ ОС вполне обязана понимать, что чужой процесс посылает что-то, а потому обязана разруливать и я убеждён, что разруливает. Нет. См.ремарки к 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 и сам понял, что так делать нельзя |