![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Control ами [D5, NT4, Win2k]
Nimbus © (2002-10-20 02:49:00)Привет, Мастера, доброго всем времени суток!
Буду очень благодарен всем откликнувшимся на мою просьбу.
Ниже приведён пример кода, который выводит пользователю название (т.е. заголовок) 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!!! Выручайте Мастера, в чём ошибка?
Nimbus (2002-10-22 00:49:00) [1]Спасибо огромное за помощь!
Теперь, я думаю, у меня всё получится.
Suntechnic (2002-10-21 16:11:00) [2]http://delphi.mastak.com/cgi-bin/forum.pl?look=1&id=1034655273&n=3
Nimbus (2002-10-21 09:19:00) [3]хммм... Джеффри Рихтера говоришь... А название книги о которой ты говоришь не подскажешь? (не буду же я все книги этого автора просматривать? :-)).
Suntechnic (2002-10-20 19:31:00) [4]>Nimbus © (20.10.02 18:09)
Я уже сказал в каком направлении копать. Копать надо в направлении внедрения в чужое адресное пространство. Сделать это можно, например, с помощью ловушек (см. статью на этом сайте http://delphi.mastak.ru/articles/hooks/index.html). Есть ещё несколько способов. Лучше всего для этого почитать Джеффри Рихтера. У него, если я правильно помню, цельный пример для ListView имеется.
Nimbus (2002-10-20 18:09:00) [5]to Suntechnic:
если Вам не сложно, то мыльните пару ссылочек на работоспособные примеры, как правильно (в моём случае) обращаться с такими сообщениями или поподробнее поясните, в каком направлении "копать". Заранее благодарю.
Suntechnic (2002-10-20 17:21:00) [6]>Nimbus © (20.10.02 16:01)
Принципиальной разницы то нет... принципиальная разница в том какое сообщение вы отсылаете.
Существуют сообщения в Win API, которые обрабатываются не так как все остальные, а по особому. Такими сообщениями являются:WM_SETTEXT, WM_GETTEXT, WM_COPYDATA. Не вдаваясь в подробности могу лишь сказать, что обработка подобных сообщений в Win API для разных процессов происходит с помощью file mapping.
Как вы уже наверное догадалисьTCM_GETITEMк таким сообщениям не относится.
Nimbus (2002-10-20 16:01:00) [7]to Suntechnic: спасибо и на этом, конечно - в общих чертах понятно, хотя могу с Вашим мнением и поспорить:
SendMessage(hWnd,WM_SETTEXT,0,lparam(PChar("бла-бла-бла")));
этот код вставит строку как в ЧУЖОЙ Edit Control, так в свой. Что Вы на это скажете, уважаемый? (принципиальной разницы между Edit Contol"ом и Tab Control"ом я не вижу - если она есть, то объясните, в чём???).
Suntechnic (2002-10-20 04:02:00) [8]Причина стара как этот мир. Нельзя получить адрес структуры, которая находится в чужом адресном пространстве. Точнее адрес то получить можно, только вот в вашем процессе этот адрес ничего не значит. Я толкую вот о какой строчке:
SendMessage(xx,TCM_GETITEM,2,integer(@Item));
Одно из потенциальных решений это внедрение в чужое адресное пространство. Каким образом это сделать обсуждалось и переобсуждалось на этом сайте десятки раз.