2010-11-21 28 views
3

我正在爲IE編寫一個附加組件。 我需要關閉外部點擊模式對話框。到目前爲止,我已經使用WM_NCACTIVATE來接收這些通知,但似乎在Windows 7(IE8)上我沒有收到這條消息(我在低完整性上運行,我用spy ++驗證了它;當我運行高完整性 - 奇怪的東西時,它看起來確實有效)。當點擊標題欄按鈕時,全局低級別的鼠標掛鉤會導致凍結

我試過爲DeskBand UI線程使用常規的鼠標鉤子。除了對話框外的所有鼠標事件外,我確實獲得了所有的鼠標事件。

所以我轉向使用全局低級別的鼠標鉤子(WH_MOUSE_LL)。 它一切正常,但從一些非常奇怪的原因,我得到一個5-10秒的凍結時,我點擊任何一個標題欄按鈕。

經過一些在線研究後,我意識到這是一個普遍的問題,但我沒有找到解決辦法。 一些人說它是性能問題,但即使我的鉤子函數只調用「CallNextHook」它仍然發生。

有關如何解決這個問題的任何想法或關閉外部點擊模式對話框的其他想法?

非常感謝, 奧馬爾

+4

我認爲這是一個奇怪的*可怕的想法*甚至試圖覆蓋標準的Windows行爲的基本位,例如Modal窗口的概念。我也懷疑這就是爲什麼你覺得這很難做到。這個問題只是讓我想知道爲什麼有人會想要這樣做,而我能想出的答案並不是很好。 – 2010-11-21 15:20:43

+0

我同意;模態對話的全部要點是模態的。如果你不想要一個模態對話框,請做對話模態。 – 2010-11-22 03:25:31

回答

0

我在低級別鼠標鉤子有這個問題爲好,打開上下文菜單時會導致系統死機的一兩秒鐘。

這是一個優先反演問題。通過調用SetThreadPriority來提高線程的安裝鉤子的優先級。

HTH

+0

Downvoters,請提供推理。 (例如,你不認爲這是一個優先倒置問題,或者你有更好的解決方案) – Fozi 2012-05-28 20:22:36

+0

我沒有downvote,但我沒有看到任何證據表明這是一個優先倒置。在沒有清楚地理解潛在問題的情況下(如證明存在優先倒置),優先考慮事項似乎是魯莽的。 – 2012-06-29 17:57:57

+1

這很難證明,但我唯一的解釋。事實是:沒有鼠標鉤,工作正常。鼠標鉤:偶爾掛起。高優先級線程中的鼠標鉤子:工作正常。我可以每次重現它。如果有人有更好的解釋,我很樂意聽到它。 – Fozi 2012-07-01 18:24:17

1

我通過刪除WH_MOUSE_LL來解決這個問題。 這在Windows XP中正常工作,但凍結整個計算機,有時直到我打開和關閉計算機。

我覺得很荒謬,他們還沒有修復這個bug。 它浪費了我很多時間。

0

受過教育的猜測:我懷疑由於您是IE附加組件,因此您正在運行一個低完整性的進程(這是IE的保護模式的工作方式)。默認情況下,低完整性進程不能將窗口消息發送到中等或高完整性進程。標題欄可能是IE框架的一部分,這可能是一箇中等程度的完整性過程。在你的鉤子處理中,也許你正在發送一個額外的消息。例如,由於它是對話框外的點擊,因此您可能會發送一條消息來關閉對話框。完整性機制會阻止郵件,因爲您正在穿過低完整性/中等完整性邊界。五秒鐘後,系統確定該應用程序已無響應,從而設法獲得原始點擊消息。

換句話說:從一個低完整性的過程中設置一個低級鉤子幾乎肯定是一個壞主意。

(一般而言,全局鉤子通常是一個糟糕的主意,因爲它們會在系統中的所有UI進程上施加成本,其他程序不應該爲您的程序正確行爲而支付稅款。)

Windows中的模態對話框有OK/Cancel/Dismiss命令按鈕。你的應該不是一個例外。通過點擊離開對話框會違反設計模型,因此實施此操作可能會遇到困難,即使您管理了脆弱的黑客攻擊,它也可能會混淆和惹惱用戶。

Windows中的其他元素(如彈出式菜單或下拉式菜單)通過捕獲鼠標實現了近距離點擊(請參閱SetCapture),該菜單代碼允許菜單代碼查看鼠標何時執行某些操作窗戶。但是這對於對話來說是非常困難的,因爲對話框中的子控件也需要與鼠標進行交互。捕獲鼠標將防止孩子得到他們需要的信息。

您需要重新設計與設計該功能的人的關閉點擊決定。任何試圖實施它的嘗試都是脆弱的黑客攻擊,很可能會讓用戶感到困惑。

相關問題