来自DLL的DELPHI MessageDlg调用中断控制焦点
最近升级到RAD XE8 我有一个dll,其中包含几个消息DLG调用,例如警告/信息等,例如来自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 显示消息,但当我单击且消息框消失时,我
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