最近升级到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
莲
答案 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)