Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-14158
Yaro
2002-08-24 22:52
2002.09.05
Как лучше организовать подключение к серверу?


3-13961
Guest2
2002-08-16 11:58
2002.09.05
Помогите с SQL


8-14183
BJValentine
2002-04-25 20:03
2002.09.05
Вывод графики на экран


3-13903
KAA
2002-08-14 18:43
2002.09.05
2000 Функция - число прописью


3-13973
Викт0р
2002-08-16 15:33
2002.09.05
dBase 4





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский