2015-07-13 41 views
1

最近升級到RAD XE8。DELPHI MessageDlg來自DLL的調用會中斷控制焦點

我有一個DLL與幾個MessageDLg調用例如警告/信息等

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 

,但在我的應用程序

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

(在通過函數信息()的DLL調用的MessageDlg) 僅爲調試目的添加了CanFocus

因此,DBGrid上的第一個dblclick調用Information,但在VCL中未檢測到隨後的dblclicks(消息通過Windows Detective可見)。 in VC.LDBGids TCustomDBGrid.AcquireFocus: 重點是第一次和False,隨後,直到我點擊第二個控件,然後回到DBGrid。

他的問題是否更明確?

TIA

+0

是DLL與此有關。嘗試在非常簡單的VCL應用程序中重現此問題,其中所有代碼都駐留在同一個可執行模塊中。儘量減少這種微不足道的繁殖。 –

+0

我做到了。它只發生在DLL中。將MessageDlg更改爲嘟嘟聲;沒有任何問題。 – Ephraim

+0

更改嘟嘟聲證明什麼都沒有。你能製作一個MCVE嗎?否則,我們必須嘗試這樣做,並且根據我的經驗,那麼經常發生的是我們生成的代碼實際上與您的代碼不同。 –

回答

0

編輯:設置全局變量UseLatestCommonDialogsFalse解決了這個問題!

我遇到了同樣的問題,並在Embarcadero論壇上發佈了一個問題。我希望你的答案幫助:

這是因爲沒有屬於EXE的HWNDs都被 作爲業主爲模態對話框窗口,因此關閉時不能 焦點正確還原。這就是爲什麼你必須再次點擊網格 才能重新獲得焦點。

Raymond Chen在MSDN上有一篇關於他的「舊新事物」 的博文,討論與模式窗口所有權有關的問題(或缺少 )。

這是因爲在EXE中調用MessageDlg()可以訪問 EXE的TApplication和TForm HWND以用作模態對話所有者。A DLL不具有相同的訪問權限。

我建議完全擺脫DLL內的MessageDlg()。 而不是直接調用Win32 MessageBox()或TaskDialog(),那麼你可以提供你需要的所有HWND作爲所有者窗口。

雷米勒博(TeamB)