1 前言
我們經常會遇到很多介面十分漂亮的軟體,我們在驚嘆其作者高超水平的同時,心中也不禁會想:自己怎樣才能作出這樣的介面呢?本文就從設計乙個視窗資訊讀取程式入手,利用c++builder適合於快速開發的特點,詳細的介紹了其實現過程。有了本程式,我們可以很輕鬆的去讀取別人程式視窗中的各種資訊,從中獲取我們想要的資訊。
2 相關知識
2.1 控制代碼
要想在程式中實現對其他程式視窗資訊的讀取,必須先獲得對該視窗的控制權,在具體程式設計中,我們可以通過獲取目標視窗的控制代碼來實現對該視窗的各種操作。那麼,何為控制代碼呢?從資料型別上看控制代碼是乙個無符號整數,windows用它來標識窗體或其他物件,例如字型或位圖。windows分配給每個視窗乙個唯一的控制代碼,通過控制代碼操縱該視窗。通俗地說,控制代碼就像一把扇子的柄,一扇門的把手,只有通過柄和把手,我們才能順利地控制扇子和門。同理,當要操縱某乙個視窗時,需要先獲取該視窗的控制代碼。獲取視窗控制代碼的函式很多,較為常用的乙個是windowfrompoint,其用途是返回指定座標下視窗的控制代碼。該函式有乙個引數,原型如下:
hwnd windowfrompoint (
point point // 指定的座標(位置)
);//如果成功函式返回指定座標下視窗的控制代碼,否則返回null
通過以上函式,我們可以獲得目標視窗的控制代碼,以便我們通過控制代碼對視窗進行操縱,從而讀取目標視窗的各種資訊。
2.2 訊息
訊息(message)就是指windows作業系統發給應用程式的乙個通知, 告訴應用程式某個事情發生了。從資料結構的角度看,訊息是乙個結構體,它包含了訊息的型別識別符號以及其他一些附加訊息。這樣,接受訊息的物件就能根據這個訊息的識別符號知道系統中發生了什麼事情,並利用其附加資訊作出適當的反應。在本程式中,將使用到的訊息有:
(1)wm_gettextlength
當程式向目標視窗傳送此訊息後,將得到與該目標視窗有關的文字的長度(不包含空字元) 。
(2)wm_gettext
應用程式傳送此訊息來複製對應視窗的文字到緩衝區。
(3)lb_getcount和lb_gettext
傳送訊息lb_getcount後可以獲取目標視窗中listbox中的專案總數,而訊息lb_gettext的作用為從該listbox中得到某一條記錄。
(4)cb_getcount 和cb_getlbtext
作用同上, 可以獲取目標視窗中combobox中的專案總數和其中某一條記錄。
2.3 讀取視窗各類資訊時用到的函式
(1) getwindowrect
該函式可獲得整個視窗的矩形範圍,原型如下:
bool getwindowrect (
hwnd hwnd, // 欲獲得矩形範圍的那個視窗的控制代碼
lprect lprect // 裝載視窗矩形範圍的座標值
); //成功返回非零,否則返回零
(2)getclassname
函式取得指定視窗的類名,其原型為:
int getclassname(
hwnd hwnd, // 欲獲得類名的那個視窗的控制代碼
lptstr lpclassname, // 存放類名的緩衝區
int nmaxcount // 緩衝區長度
); //成功返回拷貝至緩衝區的類名,失敗返回零
(3)getwindowlong
函式的作用是從指定的視窗中獲取資訊,原型:
long getwindowlong(
hwnd hwnd, // 欲獲取資訊的視窗的控制代碼
int nindex// 想要取回的資訊,可以是下表中任何乙個常數:
gwl_exstyle//擴充套件視窗樣式 gwl_style 視窗樣式
gwl_wndproc//該視窗的視窗函式的位址gwl_hinstance擁有視窗的例項的控制代碼
gwl_hwndparent//該視窗的父視窗控制代碼gwl_id對話方塊中乙個子視窗的識別符號
gwl_userdata//含義由應用程式規定dwl_dlgproc視窗的對話方塊函式位址
dwl_msgresult //在對話方塊函式中處理的一條訊息返回的值
dwl_user //含義由應用程式規定
); //函式返回值由引數nindex來決定要返回哪個方面的當前值,若出錯則返回0
(4)sendmessage
向視窗傳送某一指定訊息時用到此函式,函式的原型為:
lresult sendmessage(
hwnd hwnd, // 目標視窗的控制代碼
uint msg, // 將要傳送的訊息
wparam wparam, // 訊息第乙個的引數
lparam lparam //訊息的第二個引數
); (5)getdc
獲取指定視窗的裝置場景,函式有乙個引數,原型:
hdc getdc(
hwnd hwnd//將獲取其裝置場景的視窗控制代碼,若為0,表示要獲取整個螢幕dc
); //返回指定視窗的裝置場景控制代碼,出錯則為null
(6)getpixel
getpixel函式可獲取指定座標下的畫素點的rgb顏色值。原型如下:
colorref getpixel(
hdc hdc, //裝置場景的控制代碼
int nxpos, //邏輯座標(x座標)中要檢查的點
int nypos //邏輯座標(y座標)中要檢查的點
); (7)getrvalue 、getgvalue 、getbvalue
這3個函式分別得到顏色的紅、綠、藍分量值。
3 程式的實現及關鍵**分析
以下是用c++ builder6編寫的程式**,實現了對其他程式視窗資訊的讀取探測。
point pmouse;
char strclassname[255], strcaption[255]; // 定義存放視窗類名和視窗標題的變數
int strtextlength; // 文字長度
if(bmousedown) // 如果按下了滑鼠
else
editcaption->text = "無";// 判斷是否為密碼框,先獲取視窗(控制項)風格,再看是否有密碼屬性
if(es_password&getwindowlong(hwnd,gwl_style))// 具有密碼屬性
editispsw->text="是密碼框";
else
editispsw->text="(否)不是密碼框";
// 取 listbox ,memo 的內容
if(editclassname->text.pos("listbox")>0)
// 如果物件為listbox
} if(editclassname->text.pos("memo")>0) // 如果物件為memo
// 獲取顏色
hdc hdc = getdc(0);
colorref cl = getpixel(hdc,pmouse.x,pmouse.y);
int r,g,b;
r = getrvalue(cl);
g = getgvalue(cl);
b = getbvalue(cl);
} //目標視窗不能為本程式視窗
} //if(bmousedown)
4 結束語
本文在實現乙個視窗資訊讀取程式的同時,詳細介紹了其相關函式的功能和應用,並給出了相應的完整c++builder源程式, 我們還可以在此程式基礎上,通過一定的修改實現更加複雜的資訊探測讀取功能。本程式在c++builder6.0+windows xp環境下編譯通過。在windows xp\2000下測試良好。
捕捉桌面上的視窗資訊
今天我為大家帶來乙個有趣的例子,有點像spy 的功能,通過滑鼠在螢幕上移動,並實時捕捉指定座標點處的視窗資訊。視窗資訊包括視窗標題,視窗控制代碼,視窗類名,以及呈現所捕捉視窗的縮圖。現在我們不妨來思考一下,要實現這些功能,我們需要準備哪些技術要點?1 獲取當前滑鼠指標的螢幕座標,這個用system....
通過讀登錄檔檢測本機串列埠資訊
用qt做上位機,使用串列埠通訊時,想自動掃瞄串列埠裝置,即在下拉列表框中,只顯示已有的串列埠。本來挺簡單的,只要輪詢hkey local machine hardware devicemap serialcomm就能找到已有的串列埠,但qt的qsettings有個bug,如果鍵名裡有斜槓 則讀出的鍵...
udp繫結埠資訊
會變的埠號 重新執行多次指令碼,然後在 網路除錯助手 中,看到的現象如下 說明 每重新執行一次網路程式,上圖中紅圈中的數字,不一樣的原因在於,這個數字標識這個網路程式,當重新執行時,如果沒有確定到底用哪個,系統缺省會隨機分配 記住一點 這個網路程式在執行的過程中,這個就唯一標識這個程式,所以如果其他...