2015-11-04 72 views
0

我有以下問題。我正在使用webbrowser delphi組件,發生了訪問網站這個消息框在我看來,但是,我把一個代碼放在一個計時器,以便當它看起來對話關閉它。這是不可能關閉瀏覽器的delphi消息框

var 
    hand: Thandle; 
begin 
    hand := findwindow(nil,'Windows Internet Explorer'); 
    SendMessage(hand, WM_CLOSE, 0, 0); 
end; 

但是當它出現時不關閉對話框。我現在到底發生了什麼,請留下一張照片,以便他們瞭解一點問題,謝謝。我希望這個問題了解

enter image description here

+0

你最好先避開對話框。這是我一直在尋找的方法。 –

回答

6

對話框不會關閉響應WM_CLOSE消息,因爲該對話框沒有在標題欄的關閉按鈕,在你的屏幕截圖可以清楚地看到。這種特殊的對話正在通過TaskDialogIndirect()顯示爲Task Dialog沒有指定的TDF_ALLOW_DIALOG_CANCELLATION標誌:

TDF_ALLOW_DIALOG_CANCELLATION
表明,該對話框應該能夠使用的Alt-F4,逃避關閉,標題欄的即使沒有在dwCommonButtons或pButtons成員中指定取消按鈕,也可以關閉按鈕

沒有該標誌,只能通過單擊提供的其中一個Command Links按鈕來取消該對話框。所以你必須,直到找到按鈕,你有興趣,然後枚舉該對話框的子控件「單擊」是可編程,如:

var 
    Dlg, Sink, Btn: THandle; 
begin 
    Dlg := FindWindow('#32770', 'Windows Internet Explorer'); 
    //SendMessage(Dlg, WM_CLOSE, 0, 0); 
    Dlg := FindWindowEx(Dlg, 0, 'DirectUIHWND', nil); 
    Sink := FindWindowEx(Dlg, 0, 'CtrlNotifySink', nil); 
    while Sink <> 0 do 
    begin 
    Btn := FindWindowEx(Sink, 0, 'BUTTON', nil); 
    if Btn <> 0 then 
    begin 
     // TODO: verify this is actually the button you want... 
     SendMessage(Btn, BM_CLICK, 0, 0); 
     Break; 
    end; 
    Sink := FindWindowEx(Dlg, Sink, 'CtrlNotifySink', nil); 
    end; 
end; 

時應注意的事項的有關BM_CLICK消息字

如果該按鈕位於對話框中並且該對話框未處於活動狀態,則該消息可能會失敗。爲確保在這種情況下成功,請在發送BM_CLICK消息到按鈕之前調用SetActiveWindow函數來激活對話框。