使用FindVCLWindow调用WinHelp32(专业版的WinXP SP3 32位)在Delp

2019-06-24 21:54发布

什么是错的呢?

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。 如果我在任何国际单项体育联合会的控制鼠标,它调用帮助系统,并打开与命令上下文关联的帮助文件。 但它不工作...这是因为我还没有添加克林克支持/帮助ELinks文件本身?

为了帮助制作和开发,我使用ShalomHelpMaker软件。

Answer 1:

您是否尝试过调试代码? 你能告诉我们哪个部分出了问题。

此外,你为什么不使用像helpcontext:

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;

你可能需要一些更多的调整,但这个工程得到位置的窗口的控制。



Answer 2:

工作代码:

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

PS所有以前的代码probobly是确定的,但我却复查我的事件处理程序,发现一个的TLabel它缺少操作(虽然当我点击到过的onclick的那些,它不工作)。 加...问题probobly是错误的光标检查。

好,感谢支持你们!



文章来源: Using FindVCLWindow to call WinHelp32 (WinXP Pro SP3 32bit) in Delphi