win32 API視窗控制代碼的獲得 我的經驗

2021-03-31 08:57:00 字數 2271 閱讀 2298

初次寫文件,文筆不通暢的地方,以及理解錯誤之處望各位朋友多多指正!

這篇文章是關於如何獲取視窗控制代碼,以及有哪些函式可供使用的簡單討論!可適用於vc、bcb(其他的我沒有試,估計可以),本人在bcb環境下試驗。

首先我會羅列出一些獲取控制代碼的win32 api 函式,然後簡單說說他們的用途!最後說說我是怎麼理解和應用的。見笑了!

可用的win32 api函式:

1.hwnd findwindow(lpctstr lpclassname, lpctstr lpwindowname) 

hwnd findwindowex(hwnd hwndparent, hwnd hwndchildafter,lpctstr lpclassname, lpctstr lpwindowname) 

2.hwnd windowfrompoint(point& point)

3.bool callback enumchildproc(hwnd hwnd,lparam lparam)

bool callback enumchildwindows(hwnd hwndparent, wndenumproc lpenumfunc,lparam lparam)

bool callback enumwindows(wndenumproc lpenumfunc, lparam lparam)

bool callback enumwindowsproc(hwnd hwnd, lparam lparam)

一般用途:

對於第一種,大家都很熟悉,是捕捉控制代碼的常規**,findwindow這兩兄弟,可以接受捕捉物件的類名或者視窗標題之一,作為引數,返回乙個hwnd。可是對於一般群眾,不一定知道所有的視窗(包括標題欄、按鈕等等)的類名啊!——可以簡單舉例,請問你知道桌面圖示的視窗的類名嗎?而對於視窗標題,有可能會出現相同的標題,有兩個視窗——指乙個程式的兩個程序,這又是個麻煩吧!好了,這個問題先放放,繼續下一組。

第二組,通過win32定義的point結構(typedef struct tagpoint point),來獲得當前滑鼠游標位置的視窗hwnd,這是最直觀的**!常規操作如下:先得到cursor的point(bool getcursorpos(lppoint)函式),再用windowfrompoint。這樣,我們幾乎可以獲得任何開啟的有視窗的函式的hwnd了!然後通過獲取類名的win32 api函式(int getclassname(  hwndhwnd,   lptstrlpclassname,   intnmaxcount ))得到類名——這裡的lpclassname最好用字元陣列位址,nmaxcount就是陣列的size了,同時,這種方法解決了第乙個問題的麻煩!——我可以把滑鼠放在任何地方!*^_^*

第三組,這些是用來列舉和處理任何視窗的超級**!通過組合運用enumwindows和enumwindowsproc,enumchildwindows與enumchildproc,可以掃瞄桌面所有視窗並對之處理!

我的理解:(這部分用任務驅動式教學方法——誰讓小弟是老師呢!xi xi)

任務:得到所有的視窗的類名。

解決辦法1:我們會先想到第三組,可以自桌面視窗開始(它是所有視窗的祖先),依次掃瞄,獲取類名並存之。有點兒像visual stdio的spy++,或者borland 的winsight32,具體辦法如下:(bcb中)

在主程式中,呼叫enumwindows,傳入youenumproc的函式位址作第乙個引數,別忘了轉換成wndenumproc型別。第二參可null。::enumwindows(reinterpret_castyouenumproc,null);

在youenumproc函式中,如果第一參hwnd = = null,就跳離(return false;),可以結束啦!

然後,把類名陣列準備好,得到類名,存之。

返回真值,繼續下一次掃瞄。

看起來並不複雜,是一種函式遞迴。但是我可會解釋!面啊!: p

第二種解決方法:簡單、直觀——自己想出來的,頗得意

首先準備乙個時鐘,一種存類名方法(我用tmemo)

在定時器處理函式中:

1、得到當前cursor的點位置

2、再用windowfrompoint,

3、然後得到類名,放到tmemo裡

這樣可以用滑鼠獲得你想要的視窗(包括按鈕等),只要滑鼠在視窗放一會兒。。。哈哈

第三種方法:其實利用findwindow和迴圈結構也應該可以

總結:其實得到hwnd的方法很多,比如知道了視窗層次,依次向下掃。。。在說第三種呢!但我覺得,我的方法最直接有效,你說呢?

不清楚地方,大家要參照msdn啊!(好東西呀!)

如何獲得視窗控制代碼以及WIN32 API參考大全

在windows程式設計領域處於發展初期時,windows程式設計師可使用的程式設計工具唯有api函式。這些函式在程式設計師手中猶如 積木塊 一樣,可搭建出各種介面豐富 功能靈活的應用程式。不過,由於這些函式結構複雜,所以往往難以理解,而且容易誤用。隨著軟體技術的不斷發展,在windows平台上出現...

Win32 API講座 視窗函式

位。windows是用乙個長整形的資料的位設定方式來記錄類和視窗的樣式的。其中,視窗樣式由乙個32位樣式以及另乙個32 位擴充套件樣式來構成。類樣式操作由上述列表中的getclasslong以及getclasslong來進行,視窗樣式操作由getwindowlong 以及setwindowlong來...

視窗啟動特效,使用win32 api

一段使用api的視窗特效 自己可以試下,是不是在視窗顯示的時候會顯示各種特殊效果.有點驚喜的感覺 system.runtime.interopservices.dllimport user32 private static extern bool animatewindow intptr hwnd,...