Текущий архив: 2002.06.24;
Скачать: CL | DM;
Вниз
Внедрение в другой процесс Найти похожие ветки
← →
RazorbladE © (2002-04-18 08:53) [0]Мастера !
Хотелось бы получить !! пример внедрения в другой процесс !!,
поиска элементов управления на окне того процесса для посылки
им сообщений...
{
Продолжение предыдущего вопроса про macro ListView_GetItemTex(...)
}
P.S. WinAPI занимаюсь недавно поэтому... МНОГО вопросов...
← →
Antiox (2002-04-18 11:49) [1]Для "внедрения" в адресное пространство другого процесса можете использовать DLL + hooks.
А для посылки сообщений элементам "чужого" окна вовсе не обязательно внедряться в процесс, из которого это окно было вызванно.
← →
Ally © (2002-04-18 12:10) [2]> Antiox
Ну а если, скажем, надо взять текст из edit"а со звездочками (разумеется в чужом окне), но не в Win95/98, что сравнительно просто, а в Win2k? Никакой WM_GETTEXT, GetWindowText или что-нибудь в этом роде из своего процесса в винтукее не прокатит, и, видимо, придется внедряться чужой... Хотя я не уверен, что и это пройдет здесь.
ЗЫ. Sorry за оффтоп - вопрос-то был как раз про Win95/98, где с этим (см. выше) проблем нет :)
← →
Song © (2002-04-18 12:53) [3]2Ally © (18.04.02 12:10)
Прокатит WM_COPY
← →
Ally © (2002-04-18 14:32) [4]> 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 15:01) [5]1. Чисто гепатетически у Вас работать этот вариант не будет потому что копироваться содержимое Edit1 просто не успевает. Надо поставить Application.ProcessMessages; после копирования.
2. Понимаю сво ошибку. Действительно погарячился. Буфер обмена не работает с закрытыми Edit
Однако WM_GETTEXT должен. Здесь нет ограничений.
← →
Almaz © (2002-04-24 00:45) [6]>Song ©
> Однако WM_GETTEXT должен. Здесь нет ограничений.
Если я не ошибаюсь, WM_GETTEXT в WinNT/2k для закрытого Edit"a даст реальное значение только, если вызывающая функция находится в адресном пространстве процесса, породившего окно с этим Edit"ом.
Удачи.
← →
Raptor © (2002-04-25 15:11) [7]2 Almaz
Ты ошибаешься.
← →
Almaz © (2002-04-25 19:34) [8]2 Raptor
Нет, это ты ошибаешься.
Я только что проверил свое предположение в Win2k. И получил такой результат - если закрытому Edit"у послать сообшение WM_GETTEXT из своего процесса, то результатом будет пустая строка. Если же послать WM_GETTEXT из ловушки, внедренной в процесс, породивший Edit, то получишь тот самый скрытый текст. Не веришь - проверь.
Однако в Win98 закрытый текст можно получить сообщением WM_GETTEXT, откуда бы оно не было послано.
Удачи.
Страницы: 1 вся ветка
Текущий архив: 2002.06.24;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.018 c