Привет всем, увидел статейку про ренеймер на Delphi и решил написать свою.
В данном примере мы будем учиться писать универсальный ренеймер, он будет работать по наведению курсора на окно, ну или другой объект. Но одним наведением мы не отделаемся, нам предстоит назначить клавишу при нажатии, на которую программа будет запоминать хендл объекта, он нам понадобится для дальнейшей работы. Ну, для начала выясним что же такое хендл...
Хендл - это тип, который может содержать ссылку на объект. Используя хендлы можно заявить более одной ссылки на объект. Не все типы объектов позволяют использовать хендлы. Например не могут иметь хендлы примитивные типы данных (логический, целый, дробный, и т.д.). Возможность использования хендла зарегистрированными типами зависит от параметров регистрации.
_______________________________
Движемся дальше, теперь по пунктам для лучшего понимания происходящего:
1) Открываем Delphi, ну как же без этого
2) Я думаю проект уже создан, форма есть, кидаем на форму 7 компонентов Edit( два столбика из 3-ёх эдитов каждый + 1 эдит под всеми, смотри рисунок ниже). Они живут на вкладке Standart.
Кидаем на форму одну кнопку (Buton1) она обитает рядом с Edit'ом (вкладка Standart).
Ну и осталось кинуть таймер он на вкладке System, сразу выставим в его свойстве Interval значение 100.
Позже станет понятно для чего, всё мы закончили подготовку интерфейса:
[Ссылки могут видеть только зарегистрированные пользователи. ]
P.S
Первый Эдит - Edit1;
Последний эдит во втором столбике - Edit6.
_______________________________
2) Приступаем к коду, тут всё предельно просто...
для начала впишем процедуру для ловли хендла и прочего, пишем после ключевого слова
Код:
public
код
Код:
procedure ShowHwndAndClassName(CrPos: TPoint);
Нажимаем сочетание клавиш
Ctrl+Shift+C
delphi генерирует шаблон для процедуры, конечный её вид будет таким:
Код:
procedure TForm1.ShowHwndAndClassName(CrPos: TPoint);
var
H: THandle;[/B]
aName: array [0..255] of Char;
rName: array [0..255] of Char;
begin
h := WindowFromPoint(CrPos); // получить дескриптор
Edit1.Text := IntToStr(hWnd);
GetClassName(H, aName, 255); // получить имя класса
GetWindowText(H,rName,255); // получить название
Edit2.Text:= string(aName) ; //Присваиваем эдиту значение массива aName (строковое)
Edit3.Text:= string(rName) ; //Присваиваем эдиту значение массива rName (строковое)
end;
Поясню что мы сделали:
В разделе описания переменных (var) мы объявили одну переменную и два массива, в массивах будет храниться клас и имя объекта.
Функция GetClassName извлекает данные об имени класса, которому принадлежит указанное окно.
Функция GetWindowText копирует текст заголовка определяемого окна (если окно имеет его) в буфер. Если заданное окно является органом управления, копируется его текст. Однако функция GetWindowText не может извлекать текст органа управления в другом приложении.
Ну вот с процедурой покончено, переходим к таймеру, на нём вся работа.
3) На таймере пишем:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
Pos: TPoint; //переменная хранит значения X и Y, в данном случае координаты
begin
if Boolean(GetCursorPos(Pos)) then //узнаём координаты курсора
ShowHwndAndClassName(Pos); // Ловим курсор и то что под ним нашей процедурой
if getasynckeystate($51)<>0 // Если нажата клавиша "Q", тогда запоминаем хендл
then begin
Edit5.text:= Edit1.Text; // присваиваем эдитам второго столбца
Edit6.text:= Edit2.Text; // значение эдитов
Edit7.text:= Edit3.Text; // первого столбца
end;
end;
То есть таймер следит за тем что под курсором и как только нажимаем «Q» сразу всё запоминаем. Замечу что в строке
Код:
if getasynckeystate($51)<>0
$51 - это кодировка клавиши “Q”
4) Теперь будем писать код у нашей единственной кнопочки:
Код:
procedure TForm1.Button1Click(Sender: TObject);
beginif Edit5.Text='' then // если в эдите нет текст тогда
exit; // прекращаем делать что либо
SendMessage(StrToInt(Edit5.Text), WM_SETTEXT, 0, LParam(PChar(Edit4.Text)));
{отправляем собственный текст}
end;
Функция SendMessage отправляет заданное сообщение окну или окнам.
Ну вот и всё, осталось откомпилировать и проверить, таким вот способом мы написали ренеймер =)
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Быстрое снятие и загрузка скриншотов на хостинг.
Последний раз редактировалось Kitsune; 22.11.2010 в 14:38.
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Быстрое снятие и загрузка скриншотов на хостинг.