Вопрос по winapi, windows – Использование FindVCLWindow для вызова WinHelp32 (WinXP Pro SP3 32bit) в Delphi

0

что там не так?

procedure TForm1.VCLHelpClick(Sender: TObject);
var Ctrl : TWinControl;
 begin
 Ctrl := FindVCLWindow(Mouse.CursorPos);
 if Ctrl <> nil then
  if Form2.Cursor = crHelp then begin
   if Ctrl = CreatorEdit then Application.HelpCommand(HELP_CONTEXT,001);
   if Ctrl = EditorEdit then Application.HelpCommand(HELP_CONTEXT,002);
   if Ctrl = UpdaterEdit then Application.HelpCommand(HELP_CONTEXT,003);
   if Ctrl = IdeaEdit then Application.HelpCommand(HELP_CONTEXT,004);
   if Ctrl = PorterEdit then Application.HelpCommand(HELP_CONTEXT,005);
  end;
 end;

Идея проста - у меня есть значки границ формы для кнопки справки, и когда я нажимаю на нее, курсоры изменяются на crHelp. Если я нажимаю под управлением для любого из IF, он вызывает справочную систему и открывает связанный файл справки с контекстом из команды. Но это не работает ... Это потому, что я не добавил поддержку KLink / ELinks в сам файл справки?

Для помощи в разработке и разработке я использую программное обеспечение ShalomHelpMaker.

Ваш Ответ

2   ответа
0

Рабочий код:

procedure TForm1.VCLHelpClick(Sender: TObject);
var WCtrl : TWinControl;
begin
  WCtrl := FindVCLWindow(Mouse.CursorPos);
  if WCtrl <> nil then
   Application.HelpCommand(HELP_CONTEXT, wCtrl.HelpContext);
end;

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

Хорошо, спасибо за поддержку, ребята!

2

Вы пытались отладить код? И вы можете сказать нам, какая часть пошла не так.

Кроме того, почему вы не используете контекст справки, например:

procedure TForm1.VCLHelpClick(Sender: TObject);
var Ctrl : TWinControl;
begin
  if Form2.Cursor <> crHelp then   // Are you sure this is Form2???
    Exit;
  Ctrl := FindVCLWindow(Mouse.CursorPos);
  if Ctrl = nil then Exit;

  Application.HelpCommand(HELP_CONTEXT, Ctrl.HelpoContext);
end;

Похоже, FindVCLControl делает некоторые другие вещи. Но работает следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
  ctrl : TControl;
  point : TPoint;
begin
  point := Mouse.CursorPos; // Mouse pos at screen
  Dec(point.X, Left); // Adjust for window.
  Dec(point.Y, Top);
  Dec(point.Y, GetSystemMetrics(SM_CYCAPTION)); // Adjust to client area.

  ctrl := ControlAtPos(point, True, True, True);

  // Do something with the control
end;

Возможно, вам нужно еще немного настроить, но это работает, чтобы получить контроль над окном из позиции.

Error: User Rate Limit Exceeded HX_unbanned
Error: User Rate Limit Exceeded HX_unbanned
Error: User Rate Limit Exceeded HX_unbanned
Error: User Rate Limit Exceeded

Похожие вопросы