来自DLL的DELPHI MessageDlg调用会中断Control Focus

时间:2015-07-13 09:35:37

标签: dll messagebox delphi-xe8

最近升级到RAD XE8。

我有一个带有几个MessageDLg调用的dll,例如警告/信息等,例如

procedure Information(Msg: string); stdcall;
begin
    MessageDlg(Msg,mtInformation, [mbOK],0);
end;

我上周注意到以下情况: - 如果我双击带有处理程序的网格

begin
  Information("I am here"); //in the dll
ens  

显示消息,但是当我单击并且消息框消失时,我无法再单击网格(鼠标滚轮可以工作,但不能按下按钮)(无响应)。如果我点击第二个控件然后返回网格,那么一切都很好。

我尝试添加到DLL

uses VCL.Forms;

procedure Information(Msg: string); stdcall;
begin
  Application.Handle := GetForegroundWindow;
  try
    MessageDlg(Msg,mtInformation, [mbOK],0);
  finally
    Application.Handle := 0;
  end;
end;

无济于事。

我已经建立了以下内容: -

我的应用

CanFocus;  //DBGrid1
MessageDlg(Msg,mtInformation, [mbOK],0);
CanFocus;  //Still DBGrid

但在我的应用程序中(通过函数Information()调用DLL中的MessageDlg)

CanFocus;  //DBGrid1
Information('Hi ya');
CanFocus;  //MAINFORM

仅为调试目的添加了CanFocus

因此DBGrid上的第一个dblclick调用Information但在VCL中未检测到后续的dblclicks(通过Windows可以看到消息 侦探)。 在VC.LDBGids中TCustomDBGrid.AcquireFocus: Focused是第一次是True而后来是False,直到我点击第二个控件然后再返回DBGrid。

他的问题是否更清晰?

TIA

1 个答案:

答案 0 :(得分:0)

编辑:将全局变量UseLatestCommonDialogs设置为False解决了问题!

我遇到同样的问题并在Embarcadero论坛上发布了一个问题。我希望答案可以帮到你:

  

这是因为没有属于EXE的HWND   用作模态对话框窗口的所有者,因此无法恢复   关闭时正确对焦。这就是你必须点击网格的原因   再次重新获得关注。

     

雷蒙德·陈(Raymond Chen)有一系列关于他的旧事物的文章#34;   在MSDN上讨论与模态窗口所有权相关的问题的博客(或   缺乏)。

     

这是因为在EXE内部调用MessageDlg()可以访问   EXE的TApplication和TForm HWND用作模态对话框所有者。一个   DLL没有相同的访问权限。

     

我建议完全删除DLL中的MessageDlg()。   直接调用Win32 MessageBox()或TaskDialog(),然后调用   可以提供您所需的任何HWND作为所有者窗口。

     

Remy Lebeau(TeamB)