-
> Сергей М. © (26.08.09 21:00) [19] > Сейчас последует "Вы, ...., не умничайте - вы код давайте > !!"
ну зачем же так сурово ... ... если не трудно ... код дайте :) ... Спасибо а если серъезно сделал так (на базе [5]) ...
type
TWM_TextCapture = record
Text: PAnsiChar;
end;
const
WM_TextCapture = WM_USER + 1;
var
processWnd: HWND;
WMTextCapture: TWM_TextCapture;
...
procedure GetWndText(Wnd, SourceWnd: HWND); stdcall; export;
...
processWmd := SourceWnd;
... добавил в для проверки function MessageProc(code: integer; wParam: word;
lParam: longint): longint; stdcall;
...
WMTextCapture.Text := TimeToStr(Time);
SendMessage(processWnd, WM_TextCapture, 0, 0);
...
----------------------------------------------------------- в тестовой программе ловлю так ...
private
procedure WMTextCapture(var Msg: TWM_TextCapture); message WM_TextCapture;
...
procedure GetWndText(Wnd, SourceWnd: HWND); stdcall; external 'TxCapture.dll';
...
procedure TForm1.prWMsd(var Msg: TWM_TextCapture);
begin
Label1.Caption := TimeToStr(Time); //так сообщение принимаю - ОК Label1.Caption := Msg.Text; //Так - Error end; где ошибаюсь? как из DLL послать текст в мое приложение :(
-
> ну зачем же так сурово
А как же иначе, если это уже стало печальной традицией ?
> сделал так (на базе [5])
Из [5] тебе нужен только перехват WinAPI-вызовов, о котором идет речь в [17] п.4
Все остальное в [5] - абсолютно бесполезный хлам. Нет никакого резона приспосабливать его к твоей задаче.
-
> А как же иначе, если это уже стало печальной традицией ?
я хочу научится с этим работать, понять (понятно что на конкретном примере легче) а не просто решить вознишую проблему и забить
нашел кучу примеров посылки сообсчении из DLL но не втом виде как мне нужно
и еще CallNextHookEx(0, Code, wParam, lparam);
первый параметр не должен быть идетифицатором Hook-а?
> Из [5] тебе нужен только перехват WinAPI-вызовов, о котором > идет речь в [17] п.4 > > Все остальное в [5] - абсолютно бесполезный хлам. > Нет никакого резона приспосабливать его к твоей задаче.
как говорил с самого начала в первые приходится иметь дело с DLL
...для начала хочу добится нужного результата а потом буду ненужное убирать потому как не знаю что там нужное и что не нужное. Начал там коментировать как мне казалось ненужное - перестало работать
Вот и решил для начала принять бы Техт в мое приложение а далее ...
---------- как из DLL послать текст в мое приложение?
-
-
Чтобы вытащить текст из TLabel, не нужно внедряться и ставить хуки для перехвата, достаточно воспользоваться мощью RTTI. Нужно знать имя (или другой уникальный параметр) метки в коде (можно подсмотреть в DFM), чтобы отфильтровать ее от других. А дальше ReadProcessMemory... Я таким образом вытягиваю информацию из TStringGrid.
-
> достаточно воспользоваться мощью RTTI
Структура RTTI отличается от версии к версии. Это раз.
Что если требуется отслеживать изменения текста контрола ? На таймер что ли ставить ReadProcessMemory ? Это два.
-
>Структура RTTI отличается от версии к версии.
Со времен D3 до D2010 ничего того, что помешало бы получению данных, не изменилось. Иначе бы я и заикаться не стал на эту тему.
>Что если требуется отслеживать изменения текста контрола ? >На таймер что ли ставить ReadProcessMemory ?
А что плохого? Это очень быстро.
-
> А что плохого?
Плохое в том, что модификация данных типа string относится к атомарным операциям.
-
Не знаю почему, но у меня из головы вылетело, что нереентерабельность VCL может испортить чтение данных из чужого процесса, когда данные меняются. Потому что чтение осуществляется два раза (длина и сама строка), а нас могут вытеснить в любой момент. Я предлагаю на время чтения останавливать обновление данных (способ индивидуален в каждом конкретном случае, но не имеется в виду делать SuspendThread) и после чтения возобновлять.
-
Модификация данных типа string не относится к атомарным операциям
> предлагаю на время чтения останавливать обновление
И что толку ? Все равно это чревато как минимум недостоверным результатом, а как максимум - отказом ReadProcessMemory.
-
> И что толку ?
Скажем так, в некоторых случаях это - вариант. Возвращаясь к теме, я хотел указать именно на получение текста из неменяющегося TLabel.
-
> в некоторых случаях это - вариант
Для этих "некоторых" случаев проще и удобней будет не лезть в дебри RTTI: опять же внедрить свой код, но не для перехвата WinAPI-вызовов, а работающий напрямую с VCL-объектами в процессе-"жертве".
-
Ну, допустим, будет у нас в чужом процессе дополнительный поток, работающий напрямую с VCL-объектом. ReadProcessMemory заменяем, образно, говоря, на крышки (^), т.е. получаем доступ к данным напрямую, как в своем процессе. Проблем синхронизации это не решает. Или имеется в виду другой подход?
-
> допустим, будет у нас в чужом процессе дополнительный поток
Зачем дополнительный ? Прямо в основном и обращаемся. И крышки тут ни причем.
-
> ivanoff (25.08.09 16:06) > > получаю так > > SendMessage(H, WM_GETTEXT, 256, LParam(@S[1])); > > ... но только с Edit, Button, Panel, ... > как посмотреть что в Label написано, по его координатам
Самый простой и чаще всего работающий способ: - WmPrint окна на котором лежит label, b в качестве канваса указать битмап. - потом распознать каким-то простым алгоритмом (можно даже тупо наложением изображений букв).
|