Копирование Handle окна используя клавиатуру
Получаю Handle окна другой программы при наведении курсора мышки на форму (то есть форму другой программы). И вывожу его в LabelHandle.Caption.
Интересует ответ на вопрос: Как, при нажатии на клавиатуре, комбинации ctrl + C скопировать в буфер Handle.
procedure TForm1.Timer1Timer(Sender: TObject);
var
Wnd: HWND; // Hahdle найденного окна
Pos: TPoint; // Позиция курсора
Rect: TRect; // Координаты окна
buff: array[0..255] of char; // Буфер
WndText: string; // Текст окна
NameClass: string; // Класс окна
begin
// Получаем позицию курсора
GetCursorPos( Pos );
// Получаем Handle окна под курсором
Wnd := WindowFromPoint( Pos );
GetWindowRect( Wnd, Rect );
GetWindowText( Wnd, buff, SizeOf( buff ) );
WndText := StrPas( buff );
GetClassName( Wnd, buff, SizeOf( buff ) );
NameClass := StrPas( buff );
LabelHandle.Caption := 'Handle: ' + IntToStr( Wnd );
LabelName.Caption := 'Name: ' + WndText;
LabelClass.Caption := 'Class: ' + NameClass;
end;
Ответы (1 шт):
Если это должна быть замена таймера, то выполняем следующие шаги.
Пишем функцию.
function GetHandle: Integer;
var
Pos: TPoint; // Позиция курсора
begin
// Получаем позицию курсора
GetCursorPos( Pos );
// Получаем Handle окна под курсором
Result := WindowFromPoint( Pos );
end;
Устанавливаем перехват формой нажатие клавиш.
KeyPreview := True
Пишем событие KeyDown с проверкой на нужные клавиши и копированием в буфер.
uses
Vcl.Clipbrd;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Shift = [ssCtrl]) and (key = Ord('C')) then
Clipboard.AsText := IntToStr(GetHandle);
end;
Все это будет работать, только когда окно активно. Если требуется чтобы это работало с фокусом на любом окне, то надо использовать виндовые хуки.
Самый простой способ это выводить не в LabelHandle.Caption, а использовать TEdit, в этом случае CTRL+C будет работать из коробки, так сказать.