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

2021-05-11 16:21:59 字數 2898 閱讀 7774

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

隨著軟體技術的不斷發展,在windows平台上出現了很多優秀的視覺化程式設計環境,程式設計師可以採用"所見即所得"的程式設計方式來開發具有精美使用者介面和功能的應用程式。這些視覺化程式設計環境操作簡便、介面友好,比如:visual c++,delphi,visual basic等等。在這些工具中提供了大量的類庫和各種控制項,它們替代了api的神秘功能。事實上,這些類庫和控制項都是構築在windows api的基礎上的,但它們使用方便,加速了windows應用程式的開發,所以受到程式設計師的普遍採用。有了這些類庫和控制項,程式設計師們便可以把主要精力放在整體功能的設計上,而不必過於關注具體細節。不過,這也導致了非常多的程式設計師在類庫面前"固步自封",對下層api函式的強大功能一無所知。

實際上。程式設計師要想開發出更靈活、更實用、更具效率的應用程式,必然要涉及到直接使用api函式。雖然類庫和控制項使應用程式的開發容易得多,但它們只提供microsoft windows的一般功能,對於一些比較複雜和特殊的功能來說,單使用類庫和控制項是難以實現的,必須直接使用api函式來編寫。api函式是構築整個windows框架的基石,只有充分理解和利用api函式,才能深入到windows的內部,充分發揮各種32位平台的強大功能和靈活性,才能成功地擴充套件和突破類庫、控制項和可視開發環境的限制。

關於如何獲取視窗控制代碼,以及有哪些函式可供使用的簡單討論!可適用於vc、bcb等。

首先我們一起熟悉一些獲取控制代碼的win32 api 函式,然後簡單說說他們的用途,最後介紹一下具體應用。

可用的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。可是對於剛接觸程式設計的朋友,不一定知道所有的視窗(包括標題欄、按鈕等等)的類名。可以簡單舉例,請問你知道windows桌面視窗的類名嗎?而對於視窗標題,有可能不同視窗會出現相同的標題。好了,這個問題先放放,繼續下一組。

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

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

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

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

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

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

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

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

看起來並不複雜,是一種函式遞迴。

第二種解決方法:簡單、直觀

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

在定時器處理函式中:

1、得到當前cursor的點位置

2、再用windowfrompoint,

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

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

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

總結:其實得到hwnd的方法很多,比如知道了視窗層次,依次向下掃。。。在說第三種呢!各位朋友自己可以根據需要選擇一種最直接有效的方法。

獲取視窗的控制代碼我們就可以獲取視窗的環境引數,這樣就可以獲取裝置場景控制代碼,那麼我們可以把圖形輸出到這個裝置場景上。但是我們不可以在windows下開啟這樣乙個程序,然後再獲取另外乙個程序視窗的控制代碼,然後由這個程序控制另外乙個程序

win32視窗樣式

private const gwl style 16 視窗樣式 private sub command1 click orstyle end sub private sub orstyle dim lstyle as long lstyle getwindowlong me.hwnd,gwl sty...

WIN32視窗建立

win32視窗建立過程 1 定義視窗類 在msdn中找到函式原型 winmain 2 定義視窗處理函式 在msdn中找到原型 windowproc 3 設計視窗類 4 註冊視窗類 registerclass registerclas 5 建立視窗 createwindow createwindowe...

win32繪製視窗

static int cxclient,cyclient 宣告兩個變數存放滑鼠 x,y 座標.在下面,我們為這兩項賦值時,loword lparam 代表取 lparam 的低 16 位,hiword lparam 代表取lparam 的高 16 位,在 lparam 中存放的實際就是滑鼠的位置,低...