webkit中js調用SHBrowseForFolder時需要點擊兩次才能點中確定按鈕的bug

html form裏面的選擇文件對話框只能得到文件的名稱,拿不到文件的全路徑,只能擴展js讓其去調用通用對話框的函數,例如SHBrowseForFolder。寫完代碼後,發現需要點擊兩次才能點中確定按鈕的bug,一開始以爲是鼠標有問題,後來發現每次都是這樣,這肯定是代碼的問題了。一開始我以爲是SHBrowseForFolder調用有問題,認爲SHBrowseForFolder產生的對話框沒有獲得焦點,所以用各種方法來使得對話框獲得焦點,用各種方法都發現沒用。針對要點擊兩次的問題,我還試過模擬鼠標點擊來試圖解決這個bug,後面發現根本無效。看來應該是webkit對鼠標消息的處理有問題,看了一下WebView.cpp裏面的WebView::handleMouseEvent,發現有如下代碼:

鼠標按下:

 

 

鼠標擡起:

 

在鼠標按下時,webkit會調用SetCapture,鼠標擡起時會調用ReleaseCapture,但是ReleaseCapture在交給webcore處理之後才調用,也就是說,js裏面處理onmousedown完之後纔會調用ReleaseCapture。所以如果在onmousedown或onclick中調用SHBrowseForFolder會導致對話框裏面的事件會先交給webkit的窗口,但點擊其他窗口或點擊兩次的時候纔會讓對話框激活。解決方法也簡單,在調用SHBrowseForFolder之前先調用ReleaseCapture之前就可以了,示例代碼:

 

如果將webview.cpp的ReleaseCapture放在調用handleMouseReleaseEvent之前,應該也可以解決這個bug,但可能會引起js對drag and drop的處理出問題,所以在進行完全測試之前不建議這麼幹。

 

在解決這個bug過程中,發現瞭如下技巧:

1.如何簡單地設置SHBrowseForFolder所需的父窗口?調用::GetActiveWindow()方法就可以得到當前的active窗口,用其作爲父窗口即可。

2. 讓選擇文件夾對話框裏面的treeview獲取焦點:

 

3. Window SubClassing另類運用:http://blog.csdn.net/weizhisheng/archive/2002/02/28/9258.aspx

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章