来自DLL的DELPHI MessageDlg调用中断控制焦点

来自DLL的DELPHI MessageDlg调用中断控制焦点,dll,messagebox,delphi-xe8,Dll,Messagebox,Delphi Xe8,最近升级到RAD XE8 我有一个dll,其中包含几个消息DLG调用,例如警告/信息等,例如 procedure Information(Msg: string); stdcall; begin MessageDlg(Msg,mtInformation, [mbOK],0); end; 我上周注意到以下情况:- 如果我双击带有处理程序的网格 begin Information("I am here"); //in the dll ens 显示消息,但当我单击且消息框消失时,我

最近升级到RAD XE8

我有一个dll,其中包含几个消息DLG调用,例如警告/信息等,例如

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;
无济于事

我确定了以下内容:-

ih我的应用程序

CanFocus;  //DBGrid1
MessageDlg(Msg,mtInformation, [mbOK],0);
CanFocus;  //Still DBGrid
但是在我的应用程序中(通过函数Information()调用DLL中的MessageDlg)

仅为调试目的添加CanFocus

因此,DBGrid上的第一个dblclick调用信息,但随后的dblclick在VCL中未检测到(消息通过Windows可见) 侦探)。 在VC.LDBGids TCustomDBGrid.AcquireFocus中: Focused第一次为True,随后为False,直到我单击第二个控件,然后返回DBGrid

他的观点是否能让问题更清楚

短暂性脑缺血发作


Ephraim

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

我也有同样的问题,在Embarcadero论坛上发布了一个问题。我希望答案能帮助你:

这是因为没有一个属于EXE的HWND正在运行 用作模式对话框窗口的所有者,因此无法还原 关闭时正确对焦。这就是为什么你必须点击网格 再一次地重新聚焦

雷蒙德·陈(Raymond Chen)有一系列关于他的“新老东西”的文章 MSDN上的博客,讨论与模态窗口所有权相关的问题(或 缺乏)

这是因为在EXE中调用MessageDlg()可以访问 EXE的TApplication和TForm HWNDs用作模式对话框所有者。A. DLL没有相同的访问权限

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

雷米·勒博(B队)


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

我也有同样的问题,在Embarcadero论坛上发布了一个问题。我希望答案能帮助你:

这是因为没有一个属于EXE的HWND正在运行 用作模式对话框窗口的所有者,因此无法还原 关闭时正确对焦。这就是为什么你必须点击网格 再一次地重新聚焦

雷蒙德·陈(Raymond Chen)有一系列关于他的“新老东西”的文章 MSDN上的博客,讨论与模态窗口所有权相关的问题(或 缺乏)

这是因为在EXE中调用MessageDlg()可以访问 EXE的TApplication和TForm HWNDs用作模式对话框所有者。A. DLL没有相同的访问权限

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

雷米·勒博(B队)


DLL是否与此相关。尝试在一个非常简单的VCL应用程序中重现这个问题,其中所有代码都驻留在同一个可执行模块中。试着把它简化成一个琐碎的复制品,我做到了。它只在DLL中出现。将MessageDlg改为Beep;没问题。改变太多嘟嘟声证明不了什么。你能生产一台MCVE吗?否则我们将不得不尝试这样做,根据我的经验,经常发生的事情是,我们产生的代码实际上与您的不一样。DLL在这里是否相关。尝试在一个非常简单的VCL应用程序中重现这个问题,其中所有代码都驻留在同一个可执行模块中。试着把它简化成一个琐碎的复制品,我做到了。它只在DLL中出现。将MessageDlg改为Beep;没问题。改变太多嘟嘟声证明不了什么。你能生产一台MCVE吗?否则,我们将不得不尝试这样做,根据我的经验,经常发生的事情是,我们产生的代码实际上与您的不一样。
CanFocus;  //DBGrid1
Information('Hi ya');
CanFocus;  //MAINFORM