日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言根据窗口姓名获取句柄,win32 API窗口句柄的获得

發布時間:2024/3/26 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言根据窗口姓名获取句柄,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 {?? LONG x;

LONG y;} 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,可以掃描桌面所有窗口并對之處理!

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

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

解決辦法1:我們會先想到第三組,可以自桌面窗口開始(它是所有窗口的祖先),依次掃描,獲取類名并存之。有點兒像Visual Stdio的Spy++,或者Borland 的WinSight32,具體辦法如下:(bcb中)

在主程序中,調用EnumWindows,傳入YouEnumProc的函數地址作第一個參數,別忘了轉換成WNDENUMPROC類型。第二參可NULL。::EnumWindows(reinterpret_cast YouEnumProc,NULL);

在YouEnumProc函數中,如果第一參HWND = = NULL,就跳離(return FALSE;),可以結束啦!

然后,把類名數組準備好,得到類名,存之。

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

看起來并不復雜,是一種函數遞歸。但是我可會解釋!面啊!: p

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

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

在定時器處理函數中:

1、得到當前cursor的點位置

2、再用WindowFromPoint,

3、然后得到類名,放到TMemo里

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

第三種方法:其實利用FindWindow和循環結構也應該可以

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

歡迎大家與我聯系,并討論這個問題!有關這個問題我還有許多疑問,比如HWND與ID的轉換,在如IE頁面中的表單控件的HWND或ID,還是其他的東東,總之是能識別他的東西。。。這個我很困惑,沒辦法!

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

下面是來自微軟的例子,這個枚舉所有的窗口,然后向窗口發送關閉的消息。

#include

BOOL CALLBACK EnumWindowsProc(

HWND hwnd,

DWORD lParam

);

//

// EnumWindowsProc must be called from a Windows

// application on Windows 95.

//

int WINAPI WinMain(

HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow

)

{

//

// Close all open applications.

//

EnumWindows(EnumWindowsProc, 0);

// Now do a regular logoff.

ExitWindowsEx(EWX_LOGOFF , 0);

}

BOOL CALLBACK EnumWindowsProc(

HWND hwnd,

DWORD lParam

)

{

DWORD pid = 0;

LRESULT lResult;

HANDLE hProcess;

DWORD dwResult;

lResult = SendMessageTimeout(

hwnd,

WM_QUERYENDSESSION,

0,

ENDSESSION_LOGOFF,

SMTO_ABORTIFHUNG,

2000,

&dwResult);

if( lResult )

{

//

// Application will terminate nicely, so let it.

//

lResult = SendMessageTimeout(

hwnd,

WM_ENDSESSION,

TRUE,

ENDSESSION_LOGOFF,

SMTO_ABORTIFHUNG,

2000,

&dwResult);

}

else // You have to take more forceful measures.

{

//

// Get the ProcessId for this window.

//

GetWindowThreadProcessId( hwnd, &pid );

//

// Open the process with all access.

//

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

//

// Terminate the process.

//

TerminateProcess(hProcess, 0);

}

//

// Continue the enumeration.

//

return TRUE;

}

總結

以上是生活随笔為你收集整理的c语言根据窗口姓名获取句柄,win32 API窗口句柄的获得的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。