瀏覽器程式設計中處理鍵盤訊息

2021-04-27 23:44:50 字數 1455 閱讀 1707

一般來說,乙個瀏覽器中大致會存在哪些鍵盤訊息呢?

1、視窗的快捷鍵(如選單上的快捷鍵);

2、位址列等的鍵盤訊息;

3、瀏覽器視窗內。

據此,乙個比較理想的方法流程是:用setwindowshookex安裝wh_getmessage鉤子。這樣可以鉤住程序內所有鍵盤和滑鼠訊息,在得到訊息後,鍵盤訊息和滑鼠訊息分開處理。對於鍵盤訊息,先判斷當前的訊息是否是視窗快捷鍵,是的話,執行相應**,不是的話,放行。然後再看瀏覽器視窗當前是否獲得了焦點,若是的話,再檢查當前訊息是不是瀏覽器內「activeobject」的快捷鍵,不是的話,放行。若瀏覽器視窗沒有得到焦點,那麼直接放行。

說了這麼多,到底怎麼做呢?

關鍵點之一,就是要在瀏覽器視窗、位址列、搜尋欄(假設有)等得到焦點的時候做個標記。這樣在處理鍵盤訊息的時候就根據焦點來決定如何處理。

比如「判斷當前的訊息是否是視窗快捷鍵」怎麼實現?

一般用public declare function createacceleratortable lib "user32.dll" alias "createacceleratortablea" (byval lpaccl as long, byval centries as long) as long

這個函式來建立快捷鍵列表。然後用public declare function translateaccelerator lib "user32.dll" alias "translateacceleratora" (byval hwnd as long, byval hacctable as long, byref lpmsg as msg) as long來檢測。

然而又如何判斷「訊息是不是瀏覽器內的快捷鍵」呢?

可用ioleinplaceactiveobject的translateaccelerator來獲得。大致如下:

public function frmtranslateaccelerator(mmsg as long) as boolean

static tmsg as olelib.msg

dim tobj as olelib.ioleinplaceactiveobject

set tobj = wb

if tobj is nothing then

frmtranslateaccelerator = false

else

copymemory tmsg, byval mmsg, len(tmsg)

frmtranslateaccelerator = (tobj.translateaccelerator(tmsg) = 0)

end if

end function

到此為止,如果你很好的記住了當前是哪個物件獲得了焦點,那麼,上述思路即可很好的解決鍵盤訊息難題。

wh_getmessage鉤子同時得到滑鼠訊息,如需要處理一些滑鼠訊息,這裡是最佳途徑。比如判斷當前滑鼠是否在非客戶區右鍵等等。甚至,流行的「滑鼠手勢」也可在這裡處理。

瀏覽器生成訊息之概覽

為了更清楚地了解瀏覽器內部是怎樣工作的,同時加強計算機網路方面的知識,將在這裡對內部工作原理進行學習和總結。本文主要對瀏覽器內部生成訊息進行乙個概述 當請求訊息生成以後,瀏覽器會委託作業系統向web伺服器傳送請求,這時候,就需要web伺服器的ip位址。dns伺服器就是提供網域名稱對應位址的查詢服務。...

一 瀏覽器生成訊息(1)

1 生成http請求訊息 1 解析url 從在qq瀏覽器中輸入 url 開始,如接下來qq瀏覽器開始解析該url http 表示要訪問web伺服器,使用的協議型別是http協議 其它還有ftp file 等 其後的字串表示伺服器的名稱 www.cnblogs.com web伺服器名稱,即網域名稱 l...

瀏覽器大戰中的搜狗瀏覽器

abc 智慧型狂拼 紫光華宇,其中簡體中文全拼和智慧型 abc智慧型對於語句的輸入支援有限,而智慧型狂拼和紫光華宇詞儘管可以根據本地詞頻來智慧型新增詞語但本身詞庫更新慢,使用搜狗輸入法的原因是它每次上網時都會自動更新一些流行的詞語,使我們輸入更方便了。其實對於瀏覽器,我很少在意的,也不經常換,我自己...