Форум: "WinAPI";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];
ВнизГде ошибка? Звёздочки открывает, а текст не могу получить. Найти похожие ветки
← →
Casper_nu (2002-07-03 15:05) [0]Суть в получении содержимого поля ввода, находящегося в окне + открытие звёздочек, если есть.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Timer2: TTimer;
Memo1: TMemo;
Edit1: TEdit;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
buf : array [1..10] of char;
implementation
{$R *.DFM}
{фнукция проверяет окно на содержания полей для редактирования(EDIT) и, если таковые имеются, то открывает звёздочки}
function showpass(wnd: hwnd): BOOL; stdcall;
var c: array[0..127] of char; {тип PChar}
s: string;
begin
wnd:=GetWindow(wnd, GW_CHILD); {находим потомка}
while wnd<>0 do begin
if GetClassName(wnd, c, SizeOf(c))>0 then begin
s:=StrPAS(c); {извлекаем класс окна}
if UpperCase(s)="EDIT" then begin {если он - EDIT, т.е. поле редактирования}
sendmessage(wnd, em_setpasswordchar, 0, 0); {посылаем API функцию, которая убирает звёздочки, даже если их там нет :)}
sendmessage(wnd,LB_GETTEXT,0,integer(@buf));
form1.Memo1.Lines.Add(buf);
invalidaterect(wnd, nil, true); {перерисовываем поле}
end; end;
wnd:=GetWindow(wnd, GW_HWNDNEXT); {следующее окно}
end;
with Form1 do begin
Timer1.enabled:=false;
Timer2.enabled:=true;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
EnumWindows(@showpass, 0); {начать перебирать все окна и для каждого вызвать функцию showpass}
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1Timer(nil);
timer1.enabled:=true;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer2.enabled:=false;
Timer1.enabled:=true;
end;
end.
← →
asmer (2002-07-03 15:36) [1]у едит-боксов со стилем ES_PASSWORD заблокирована функция GetWindowText, иначе бы твоя супер-хацкерская прога не понадобилась бы - просто можно выделить всё и вставить в блокнот... :) а чтоб убрать ентот стиль можно так (сам не пробовал, если чё... но, по-моему, работать должно...):
LONG StyleEx=GetWindowLong(hWnd,GWL_EXSTYLE);
SetWindowLong(hWnd, GWL_EXSTYLE, StyleEx&(~ES_PASSWORD));
на паскаль как-нить сам переведи, если надо, ага?.. :)
← →
Raptor (2002-07-03 22:29) [2]2 Casper_nu
А почему ты используешь LB_GETTEXT. Это сообщение предназначено для вытаскивания текста из листбокса. Посылай просто WM_GETTEXT.
2 asmer
Функция GetWindowText не работает для всех эдитов в чужих процессах. Здесь надо использовать WM_GETTEXT. Но, как ты и сказал, даже это не поможет если стоит стиль ES_PASSWORD.
← →
asmer (2002-07-03 23:27) [3]GetWindowText работает для всех едитов :) ента функция в итоге и посылает сообщение WM_GETTEXT, можешь проверить, перехватив его :)
и почему все пытаются отвечать на уже отвеченные вопросы только затем, чтоб показать свои знания (или незнания :))?..
← →
SPeller (2002-07-04 02:41) [4]Как это не работает WM_GETTEXT ???
http://spellersoft.narod.ru/WndInfo.rar
Посмотрите и убедитесь что всё прекрасно работает.
Вот кусок оттуда:
Procedure TfrmMain.WMUser(Message: tagMsg);//Обработка хука на мышь
Var rs:string; hwnd:longint; i:cardinal;
Begin
case Message.WParam of
WM_MOUSEMOVE,WM_NCMOUSEMOVE: if state then begin
hwnd:=WindowFromPoint(Shareinfo^.mhs.pt);
SetLength(rs,255);
GetClassName(hwnd,@rs[1],255);
txtClass.Text:=rs;
SetLength(rs,512);
if boolean(SendMessageTimeout(hwnd,WM_GETTEXT,512,integer(@rs[1]),SMTO_ABORTIFHUNG or SMTO_NORMAL,300,i)) then txtText.Text:=rs;
end;
WM_MBUTTONDOWN:begin
State:=not State;
if State then Form.Caption:="Wnd Info - ON" else Form.Caption:="Wnd Info - OFF";
end;
end;
End;
← →
asmer (2002-07-04 02:58) [5]сообщение GET_TEXT (равно как и функция GetWindowText) НЕ МОЖЕТ получить текст из едит-бокса, пока у него есть стиль ES_PASSWORD... у меня просто нет больше слов...
← →
Casper_nu (2002-07-04 05:20) [6]Это всё конечно очень хорошо, но я не понял, как использовать энтот кусок:
LONG StyleEx=GetWindowLong(hWnd,GWL_EXSTYLE);
SetWindowLong(hWnd, GWL_EXSTYLE, StyleEx&(~ES_PASSWORD));
для снятия ES_PASSWORD.
Если кто подскажет, буду очень рад.
← →
ggrisha (2002-07-04 14:45) [7]Не знаю как в win95/98 в win2k WM_GETTEXT НЕ МОЖЕТ получить текст edit бокса из чужого приложения. Вместо него нужно использовать EM_GETLINE, который получает строку edit бокса из любого приложения.
Подставь вместо
sendmessage(wnd,LB_GETTEXT,0,integer(@buf));
следующее:
sendmessage(wnd,EM_GETLINE,0,integer(@buf));
Да и к тому же некоторые приложения перехватывают em_setpasswordchar и не дают устанавливать символ #0. Их можно заставить работать поменяв родителя окна через SetParent. Останутся скрытыми только приложения в которых в EDIT боксе действительно записаны звездочки, а не символы.
← →
asmer (2002-07-04 15:41) [8]млин... напрягся я-таки, откомпилил все вышеописанные експерименты... итак, гриша... у меня стоит винХР, но я проверил даж на вин2К для полноты - именно сообщение WM_GETTEXT работает, а EM_GETLINE, как раз, работать не желает с чужими боксами!.. теперь раптор - да, ты прав... GetWindowText не отдаёт текст из чужого бокса... и тепрь, наконец, каспер... надеюсь терь-то ты сделаешь свою хацкерскую прогу, щас я те поясню код, который я те показал... да, кстати, я запамятовал, :)пароль относится к обычному стилю окошка, а не к расширенному... типа, несколько буковок я те лишних написал...
LONG Style=GetWindowLong(hWnd, GWL_STYLE);
// ентой строчкой мы возвращаем в переменную Style текущий
// стиль окна с хэндлом hWnd, который легче всего в твоём
// хацкерском деле получить с помощью WindowFromPoint
Style&=~ES_PASSWORD;
// вынес в отдельную строчку, типа... ентот участок что-то вроде
// Style:=Style and (not ES_PASSWORD); делфи... типа, я делфи
// не очень юзаю (да простят меня участники форума :))
SetWindowLong(hWnd, GWL_EXSTYLE, Style));
// ента функция обратно присваивает изменённый стиль окошку hWnd
← →
ggrisha (2002-07-04 17:03) [9]Еще раз проверил EM_GETLINE прекрасно работает. В то время как
sendmessage(wnd,WM_GETTEXT,0,integer(@buf));
как я писал не работает. ^
Вот из за этого нулика. :-)
sendmessage(wnd,WM_GETTEXT,100,integer(@buf));
Такой вариант работает.
Стиль ES_PASSWORD убрать из окна чужого приложения неполучится. Он просто не меняется и вообще никакие стили в окне с ES_PASSWORD нельзя установить.
← →
Raptor (2002-07-04 17:14) [10]2 asmer
GetWindowText работает для всех едитов :) ента функция в итоге и посылает сообщение WM_GETTEXT, можешь проверить, перехватив его :)
Мне не надо этого проверять, я это и так знаю. Тем более, что в MSDN ясно написано: GetWindowText causes a WM_GETTEXT message to be sent to the specified window or control
Но там также написано такое:
This function cannot retrieve the text of an edit control in another application.
Я думаю, что тебе не надо переводить что это означает. Причем вышенаписаное в полной мере подтверждается экспериментами.
и почему все пытаются отвечать на уже отвеченные вопросы только затем, чтоб показать свои знания (или незнания :))?..
Что то я не заметил, что бы ты в полной мере ответил на вопрос. Даже будь это эдит без ES_PASSWORD с помощью LB_GETTEXT из него текст не вытянешь, сколько не тужся. То же относится и к GetWindowText. Здесь WM_GETTEXT нужен. Так, что по поводу знаний (или незнаний) можно еще поспорить.
← →
asmer (2002-07-04 17:31) [11]стиль менять можно... но, как оказалось, не нужно :)
If the edit control is created with the ES_PASSWORD style, the default password character is set to an asterisk (*). This style is removed if an EM_SETPASSWORDCHAR message is sent with the wParam parameter set to zero.
типа, неправы тут многие... хех... кто отламал мне скролл на мышке, а?..
← →
asmer (2002-07-04 17:37) [12]раптор, хех... я стараюсь критично к себе относиться, поентому я не грю, что незнания ко мне не относятся :) думаю, в свои одиннадцать лет у меня ещё есть время всему научиться :)
← →
Casper_nu (2002-07-04 18:46) [13]Спасибо всем. Заработало.
Вот правда ведь говорят: "В СПОРАХ РОЖДАЕТСЯ ИСТИНА!".
← →
Raptor (2002-07-04 23:01) [14]Учись-учись, asmer! Moжет будут из тебя еще люди. ;-))
← →
Suntechnic (2002-07-05 01:16) [15]>Raptor © (04.07.02 23:01)
Да написал бы уже статью по этому поводу. С переодичность раз в месяц этот флейм возникает, и у меня уже честно говоря достало отвечать и рассказывать over and over.
Последний раз, если я не ошибаюсь, мы с тобой пару месяцев назад по этому поводу флеймили. Здоровый такой флейм получился ;), как раз на статью...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c