![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Внедрение в другой процесс [D5, Win95/98]
RazorbladE © (2002-04-18 08:53:00)Мастера !
Хотелось бы получить !! пример внедрения в другой процесс !!,
поиска элементов управления на окне того процесса для посылки
им сообщений...
{
Продолжение предыдущего вопроса про macro ListView_GetItemTex(...)
}
P.S. WinAPI занимаюсь недавно поэтому... МНОГО вопросов...
Almaz (2002-04-25 19:34:00) [1]2 Raptor
Нет, это ты ошибаешься.
Я только что проверил свое предположение в Win2k. И получил такой результат - если закрытому Edit"у послать сообшение WM_GETTEXT из своего процесса, то результатом будет пустая строка. Если же послать WM_GETTEXT из ловушки, внедренной в процесс, породивший Edit, то получишь тот самый скрытый текст. Не веришь - проверь.
Однако в Win98 закрытый текст можно получить сообщением WM_GETTEXT, откуда бы оно не было послано.
Удачи.
Raptor (2002-04-25 15:11:00) [2]2 Almaz
Ты ошибаешься.
Almaz (2002-04-24 00:45:00) [3]>Song ©
> Однако WM_GETTEXT должен. Здесь нет ограничений.
Если я не ошибаюсь, WM_GETTEXT в WinNT/2k для закрытого Edit"a даст реальное значение только, если вызывающая функция находится в адресном пространстве процесса, породившего окно с этим Edit"ом.
Удачи.
Song (2002-04-18 15:01:00) [4]1. Чисто гепатетически у Вас работать этот вариант не будет потому что копироваться содержимое Edit1 просто не успевает. Надо поставить Application.ProcessMessages; после копирования.
2. Понимаю сво ошибку. Действительно погарячился. Буфер обмена не работает с закрытыми Edit
Однако WM_GETTEXT должен. Здесь нет ограничений.
Ally (2002-04-18 14:32:00) [5]> Song
Написал простенький код (см. ниже): поле edit1 - со звездочками. По нажатию кнопки копируем содержимое edit1 в буфер и вставляем его оттуда в поле edit2 c помощью пары WM_COPY -> WM_PASTE.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit; //PasswordChar := #42; - поле со звездочками
Edit2: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := EmptyStr;
SendMessage(Edit1.Handle, WM_COPY, 0, 0);
SendMessage(Edit2.Handle, WM_PASTE, 0, 0);
end;
end.
Правильно ли я Вас понял, Song? И не забыл ли чего-нибудь, потому что эффекта это не дает никакого (во всяком случае, в Win2k), пока Edit1.PasswordChar имеет значение <> #0. И работает совершенно зашибенско, если я присваиваю Edit1.PasswordChar:=#0; Замечу, что речь пока идет о контролах на одной форме (кстати, GetWindowText() в этом случае работает).
Заранее признателен, Ally.
ЗЫ. Повторюсь: хотелось бы поставить вопрос шире и решить его для Win2k.
Song (2002-04-18 12:53:00) [6]2Ally © (18.04.02 12:10)
Прокатит WM_COPY
Ally (2002-04-18 12:10:00) [7]> Antiox
Ну а если, скажем, надо взять текст из edit"а со звездочками (разумеется в чужом окне), но не в Win95/98, что сравнительно просто, а в Win2k? Никакой WM_GETTEXT, GetWindowText или что-нибудь в этом роде из своего процесса в винтукее не прокатит, и, видимо, придется внедряться чужой... Хотя я не уверен, что и это пройдет здесь.
ЗЫ. Sorry за оффтоп - вопрос-то был как раз про Win95/98, где с этим (см. выше) проблем нет :)
Antiox (2002-04-18 11:49:00) [8]Для "внедрения" в адресное пространство другого процесса можете использовать DLL + hooks.
А для посылки сообщений элементам "чужого" окна вовсе не обязательно внедряться в процесс, из которого это окно было вызванно.