Форум: "WinAPI";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
ВнизПроблема с Control ами Найти похожие ветки
← →
Nimbus (2002-10-20 02:49) [0]Привет, Мастера, доброго всем времени суток!
Буду очень благодарен всем откликнувшимся на мою просьбу.
Ниже приведён пример кода, который выводит пользователю название (т.е. заголовок) 3-й закладки Tab Control"a, который находится в точке (200;200).
Прим.: я превёл слово "Tab" как "заклАдка").
Собственно пример:
TForm1.Button1Click(Sender: TObject);
var
pos: TPoint;
Item: TC_ITEM;
xx: hWnd;
buff: array [1..15] of char;
begin
pos.x := 200;
pos.y := 200;
Item.mask := TCIF_TEXT;
Item.pszText := @buff;
Item.cchTextMax := SizeOf(buff);
xx := WindowFromPoint(pos);
SendMessage(xx,TCM_GETITEM,2,integer(@Item));
showmessage(buff);
end;
Проблема в следующем:
Если процедура выполняется в той же программе, где находится Tab Control, то всё О.К. (хотя это изврАт (мягко говоря), я это сделал для проверки, чтобы узнать, что код, в принципе, работает).
А вот если выполнить эту же процедуру из другой проги (даже состоящей только из одной этой процедуры), то в массив buff ничего не записывается!!??? При этом, есессно, Tab Control находился в той же точке (200;200) и окно было поверх всех окон.
Please, HELP!!! Выручайте Мастера, в чём ошибка?
← →
Suntechnic (2002-10-20 04:02) [1]Причина стара как этот мир. Нельзя получить адрес структуры, которая находится в чужом адресном пространстве. Точнее адрес то получить можно, только вот в вашем процессе этот адрес ничего не значит. Я толкую вот о какой строчке:
SendMessage(xx,TCM_GETITEM,2,integer(@Item));
Одно из потенциальных решений это внедрение в чужое адресное пространство. Каким образом это сделать обсуждалось и переобсуждалось на этом сайте десятки раз.
← →
Nimbus (2002-10-20 16:01) [2]to Suntechnic: спасибо и на этом, конечно - в общих чертах понятно, хотя могу с Вашим мнением и поспорить:
SendMessage(hWnd,WM_SETTEXT,0,lparam(PChar("бла-бла-бла")));
этот код вставит строку как в ЧУЖОЙ Edit Control, так в свой. Что Вы на это скажете, уважаемый? (принципиальной разницы между Edit Contol"ом и Tab Control"ом я не вижу - если она есть, то объясните, в чём???).
← →
Suntechnic (2002-10-20 17:21) [3]>Nimbus © (20.10.02 16:01)
Принципиальной разницы то нет... принципиальная разница в том какое сообщение вы отсылаете.
Существуют сообщения в Win API, которые обрабатываются не так как все остальные, а по особому. Такими сообщениями являются:WM_SETTEXT, WM_GETTEXT, WM_COPYDATA
. Не вдаваясь в подробности могу лишь сказать, что обработка подобных сообщений в Win API для разных процессов происходит с помощью file mapping.
Как вы уже наверное догадалисьTCM_GETITEM
к таким сообщениям не относится.
← →
Nimbus (2002-10-20 18:09) [4]to Suntechnic:
если Вам не сложно, то мыльните пару ссылочек на работоспособные примеры, как правильно (в моём случае) обращаться с такими сообщениями или поподробнее поясните, в каком направлении "копать". Заранее благодарю.
← →
Suntechnic (2002-10-20 19:31) [5]>Nimbus © (20.10.02 18:09)
Я уже сказал в каком направлении копать. Копать надо в направлении внедрения в чужое адресное пространство. Сделать это можно, например, с помощью ловушек (см. статью на этом сайте http://delphi.mastak.ru/articles/hooks/index.html). Есть ещё несколько способов. Лучше всего для этого почитать Джеффри Рихтера. У него, если я правильно помню, цельный пример для ListView имеется.
← →
Nimbus (2002-10-21 09:19) [6]хммм... Джеффри Рихтера говоришь... А название книги о которой ты говоришь не подскажешь? (не буду же я все книги этого автора просматривать? :-)).
← →
Suntechnic (2002-10-21 16:11) [7]http://delphi.mastak.com/cgi-bin/forum.pl?look=1&id=1034655273&n=3
← →
Nimbus (2002-10-22 00:49) [8]Спасибо огромное за помощь!
Теперь, я думаю, у меня всё получится.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c