Уловить щелчок мышью по любому компоненту VCL и определить его значение .Tag

Я использую самодельный инструмент перевода. (В следующий раз я воспользуюсь одной из библиотек, как описано здесь: инструмент перевода delphi .)

Мои переводчики жалуются, что перевод длинного списка строк затруднен, потому что они не видят их в контекст (на экране, в котором они появляются.)

Один переводчик сделал отличное предложение, чтобы у него была возможность щелкнуть компонент, чтобы изменить его текст. Я могу реализовать это , если я смогу найти способ перехватить всю программу, событие, чтобы, когда пользователь нажимает на компонент, удерживая нажатой клавишу CTRL, вызывается обработчик событий. Обработчик событий определит, есть ли у компонента файл.Caption, и если да, то получить значение компонента Tag (а затем разрешить некоторый ввод данных пользователем.)

(Каждый переводимый компонент правильно имеет уникальное целое число в своем теге, которое я использую для поиска компонента .Caption.)

Есть предложения, как это сделать? Это над моей головой. Мне нужно что-то вроде KeyPreview формы, но для щелчков мышью, чтобы выяснить, какой компонент VCL был нажат, и определить его значение .Tag.

Том

РЕДАКТИРОВАТЬ:

Используя предложение Дэвида Х., единственные события, которые я получаю, - это когда приложение получает фокус или теряет его. Что я сделал не так?

    function TForm1.AppHookFunc(var Message : TMessage) : Boolean;
    begin
      Result := FALSE;
      inc(i); outputdebugstring(Pchar(inttostr(i) + ': ' + IntTostr(Message.msg)));
      if Message.Msg = WM_MBUTTONDOWN then
        begin      Beep;
        //...DoSomething...
        //Result := True;
        end;
    end;

    procedure TForm1.FormCreate(  Sender: TObject);
    begin
      Application.HookMainWindow(AppHookFunc);
    end;

    procedure TForm1.FormDestroy(
      Sender: TObject);
    begin
      Application.UnHookMainWindow(AppHookFunc);
    end;

РЕДАКТИРОВАТЬ 2

Я почти готов! Но FindDragTarget редко возвращает что-либо, кроме нуля. Если я сделаю огромную кнопку, закрывающую большую часть элемента управления, иногда мне удается заставить ее работать. Координаты X, Y в полученном tagMSG относятся к элементу управления. Я бы хотел, чтобы они относились к форме. Я все еще использую другой обработчик событий, чем должен? Любые предложения:

  procedure TForm1.ApplicationEvents1Message( var Msg: tagMSG;
                                              var Handled: Boolean);
  var
    Target: TControl;
    Point: TPoint;
  begin
    Handled := FALSE;
    if (Msg.Message = WM_LBUTTONDOWN) And isAltDown then
      begin
        Point.X := LongRec(Msg.lParam).Lo;
        Point.Y := LongRec(Msg.lParam).Hi;
        Target := FindDragTarget( Point, {AllowDisabled=}TRUE);
        if Assigned(Target) then
          begin
            if Target Is TButton then
              outputdebugString(Pchar(TButton(Target).Caption));
          end
        else
          outputdebugstring(Pchar(IntToStr(Point.X) + ', ' + IntToStr(Point.Y)));
      end;
  end;

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:

Я изменил приведенный выше код, чтобы использовать GetCursorPos, а не Msg.lParam. Теперь работает. Очень круто! ТАК КАК!

СПАСИБО ОБЕИМ ЗА ПОМОЩЬ!

8
задан Community 23 May 2017 в 12:13
поделиться