На этот раз я хочу рассмотреть устройство своей программы ХарАКтЕР(http://newff.narod.ru/char.rar), а точнее реализацию двух ключевых функций.
Эта программа умеет делать активными все (почти) элементы GUI Windows: неактивные окна, кнопки, поля и т.д.
Ещё одна возможность этой программы - показать пароли, где они были спрятаны за символом "*".
Замечу, что освобождение паролей от звёздочек - далеко не оригинальная возможность (она уже была реализована до меня), а вот снятие флага Disabled - изюминка этой программки.
Скажу ещё, что методы, используемые для этих двух возможностей, я придумал сам.
Оригинальное название ХарАКтЕР, но так как программа, которая будет здесь описана, только использует её ключевые методы, я назвал её просто Hacker.
Справедливо будет спросить, для чего это надо? Ответьте сами на этот вопрос.
Описание работы.
Итак. Для того, чтобы активизировать объекты мы будем использовать процедуру EnableWindow.
Первый её параметр - hWnd (дескриптор элемента, к которому мы обращаемся), второй (boolean) обозначает что нужно сделать: True - активизировать, False - дизактивизировать.
Раз мы собираемся активизировать, то вид должен быть таким:
EnableWindow(hWnd,True); Но дело в том, что нам нужно знать дескриптор элемента (hWnd), который делаем активным.
Я очень быстро нашёл выход. Так как hWnd это ничто иное, как обычное целое число, мы просто будем перебирать все hWnd в промежутке от 0 до 20000 (это с большим припуском, т.к. обычно все элементы умещаются в первые 5000).
Вот что у нас получается:
var
i: word;
begin
for i:=1 to 20000 do
EnableWindow(i,true);
end;
Перебирать все дескрипторы - немного нестандартный подход, но на скорость он влияет по-минимуму - будем мы проверять 1, 20000 или 100000 дескрипторов.
Чтобы убирать звёздочки используется точно такая же схема, только с процедурой SendMessage(i,EM_SETPASSWORDCHAR,0,0);.
* Разумеется, процедуры будут расходоваться и на дескрипторы элементов, для которых эти процедуры не имеют смысла, но это ничего за собой не влечёт - они просто будут проигнорированы.
Плюсы.
На этот раз доминируют плюсы, потому будем рассматривать их:
+ эффективный подход по определению дескрипторов (его просто нет, перебираем все),
+ очень простой код (всё гениальное...).
procedure TForm1.Button1Click(Sender: TObject);
var
i: word;
begin
for i:=1 to 20000 do //перебираем дескрипторы
EnableWindow(i,true); //активизируем всё
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: word;
begin
for i:=1 to 20000 do //перебираем дескрипторы
SendMessage(i,EM_SETPASSWORDCHAR,0,0); //снимаем звёздочки
end;
end.
Все вопросы и пожелания ко мне, т.е. ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Перепубликация допускается только с моего разрешения.
В случае, если вы будете использовать приведённые в этой рассылке коды, не забудьте сделать ссылку на мой сайт.