WindowsAPI-Findwindow函数和FindWindowEx用法
1.函數(shù)說(shuō)明:
FindWindow,Win32 API函數(shù)。
FindWindow函數(shù)返回與指定字符串相匹配的窗口類名或窗口名的最頂層窗口的窗口句柄。這個(gè)函數(shù)不會(huì)查找子窗口。
2.函數(shù)原型:
HWND FindWindow(? ?
??????????????LPCTSTR lpClassName,
? ???????????????LPCTSTR lpWindowName ? ? ? ?
????????????????);
3.參數(shù)說(shuō)明:
lpClassName
指向一個(gè)以null結(jié)尾的、用來(lái)指定類名的字符串或一個(gè)可以確定類名字符串的原子。如果這個(gè)參數(shù)是一個(gè)原子,那么它必須是一個(gè)在調(diào)用此函數(shù)前已經(jīng)通過(guò)GlobalAddAtom函數(shù)創(chuàng)建好的全局原子。這個(gè)原子(一個(gè)16bit的值),必須被放置在lpClassName的低位字節(jié)中,lpClassName的高位字節(jié)置零。
lpWindowName
指向一個(gè)以null結(jié)尾的、用來(lái)指定窗口名(即窗口標(biāo)題)的字符串。如果此參數(shù)為NULL,則匹配所有窗口名。
4返回值:
如果函數(shù)執(zhí)行成功,則返回值是擁有指定窗口類名或窗口名的窗口的句柄。
如果函數(shù)執(zhí)行失敗,則返回值為?NULL?。可以通過(guò)調(diào)用GetLastError函數(shù)獲得更加詳細(xì)的錯(cuò)誤信息。
5.使用示例:
HWND hWndRcv = ::FindWindow(NULL,"123");
if(hWndRcv != NULL)
{
???AfxMessageBox("找到123窗口");
}
/****************/
FindWindow(
lpClassName,??????? {窗口的類名}
lpWindowName: PChar {窗口的標(biāo)題}
): HWND;????????????? {返回窗口的句柄; 失敗返回 0}
//FindWindowEx 比 FindWindow 多出兩個(gè)句柄參數(shù):
FindWindowEx(
Parent: HWND;???? {要查找子窗口的父窗口句柄}
Child: HWND;????? {子窗口句柄}
ClassName: PChar; {}
WindowName: PChar {}
): HWND;
{
如果 Parent 是 0, 則函數(shù)以桌面窗口為父窗口, 查找桌面窗口的所有子窗口;
如果 是 HWND_MESSAGE, 函數(shù)僅查找所有消息窗口;
子窗口必須是 Parent 窗口的直接子窗口;
如果 Child 是 0, 查找從 Parent 的第一個(gè)子窗口開(kāi)始;
如果 Parent 和 Child 同時(shí)是 0, 則函數(shù)查找所有的頂層窗口及消息窗口.
}
--------------------------------------------------------------------------------
//測(cè)試1: 試著找找新建程序主窗口的句柄
var
h: HWND;
begin
{現(xiàn)在我們知道窗口的標(biāo)題是: Form1、窗口的類名是: TForm1}
h := FindWindow('TForm1', 'Form1');
ShowMessage(IntToStr(h));????? {656180; 這是隨機(jī), 每次啟動(dòng)窗口肯定不一樣}
{假如不知道類名}
h := FindWindow(nil, 'Form1');
ShowMessage(IntToStr(h));????? {656180}
{假如不知道標(biāo)題名}
h := FindWindow('TForm1', nil);
ShowMessage(IntToStr(h));????? {656180}
{其實(shí)這個(gè)窗口的句柄不就是 Self.Handle 嗎}
ShowMessage(IntToStr(Handle)); {656180}
end;
--------------------------------------------------------------------------------
//測(cè)試2: 找計(jì)算器窗口的句柄(先打開(kāi)計(jì)算器)
var
h: HWND;
begin
{如果不是簡(jiǎn)體中文系統(tǒng), 這樣可能不靈}
h := FindWindow(nil, '計(jì)算器');
ShowMessage(IntToStr(h)); {1508334}
{最好這樣, 但你得提前知道計(jì)算器窗口的類名是: SciCalc}
h := FindWindow('SciCalc', nil);
ShowMessage(IntToStr(h)); {1508334}
end;
/******************************/
1 FindWindow函數(shù):
函數(shù)功能:該函數(shù)獲得一個(gè)頂層窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個(gè)函數(shù)不查找子窗口。在查找時(shí)不區(qū)分大小寫(xiě)。
函數(shù)型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
參數(shù):
IpClassName :指向一個(gè)指定了類名的空結(jié)束字符串,或一個(gè)標(biāo)識(shí)類名字符串的成員的指針。如果該參數(shù)為一個(gè)成員,則它必須為前次調(diào)用theGlobafAddAtom函數(shù)產(chǎn)生的全局成員。該成員為16位,必須位于IpClassName的低 16位,高位必須為 0。
IpWindowName:指向一個(gè)指定了窗口名(窗口標(biāo)題)的空結(jié)束字符串。如果該參數(shù)為空,則為所有窗口全匹配。
返回值:如果函數(shù)成功,返回值為具有指定類名和窗口名的窗口句柄;如果函數(shù)失敗,返回值為NULL
2 FindWindowEx函數(shù):
函數(shù)功能:該函數(shù)獲得一個(gè)窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個(gè)函數(shù)查找子窗口,從排在給定的子窗口后面的下一個(gè)子窗口開(kāi)始。在查找時(shí)不區(qū)分大小寫(xiě)。
函數(shù)原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);
參數(shù):
hwndParent:要查找子窗口的父窗口句柄。
如果hwnjParent為NULL,則函數(shù)以桌面窗口為父窗口,查找桌面窗口的所有子窗口。
Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函數(shù)僅查找所有消息窗口。
hwndChildAfter :子窗口句柄。查找從在Z序中的下一個(gè)子窗口開(kāi)始。子窗口必須為hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter為NULL,查找從hwndParent的第一個(gè)子窗口開(kāi)始。如果hwndParent 和 hwndChildAfter同時(shí)為NULL,則函數(shù)查找所有的頂層窗口及消息窗口。
lpszClass:指向一個(gè)指定了類名的空結(jié)束字符串,或一個(gè)標(biāo)識(shí)類名字符串的成員的指針。如果該參數(shù)為一個(gè)成員,則它必須為前次調(diào)用theGlobaIAddAtom函數(shù)產(chǎn)生的全局成員。該成員為16位,必須位于lpClassName的低16位,高位必須為0。
lpszWindow:指向一個(gè)指定了窗口名(窗口標(biāo)題)的空結(jié)束字符串。如果該參數(shù)為 NULL,則為所有窗口全匹配。返回值:如果函數(shù)成功,返回值為具有指定類名和窗口名的窗口句柄。如果函數(shù)失敗,返回值為NULL。
3命名空間 :
using System.Runtime.InteropServices;
4編程實(shí)例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
namespace ConsoleApplication1
{
? ? class Program
? ? {
? ? ? ? [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
? ? ? ? static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
? ? ? ? [DllImport("user32.dll", EntryPoint = "FindWindowEx", CharSet = CharSet.Auto)]
? ? ? ? extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
? ? ? ? [DllImport("User32.dll", EntryPoint = "SendMessage")]
? ? ? ? private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
? ? ? ? [STAThread]
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? const int BM_CLICK = 0xF5;
? ? ? ? ? ? IntPtr maindHwnd = FindWindow(null, "父窗體句柄"); //獲得父窗體句柄 ?
? ? ? ? ? ? if (maindHwnd != IntPtr.Zero)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "登錄按鈕"); ? //獲得按鈕的句柄 ?
? ? ? ? ? ? ? ? if (childHwnd != IntPtr.Zero)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.WriteLine("找到子窗口"+childHwnd);
? ? ? ? ? ? ? ? ? ? SendMessage(childHwnd, BM_CLICK, IntPtr.Zero, null); ? ? //發(fā)送點(diǎn)擊按鈕的消息 ?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.WriteLine("沒(méi)有找到子窗口");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine("沒(méi)有找到窗口");
? ? ? ? ? ? }
? ? ? ? ? ? Console.ReadKey();
? ? ? ? }
經(jīng)過(guò)調(diào)試可得上面的子窗口的句柄好像獲取不到,不知道什么原因,但是呢,在自己創(chuàng)建的winfrom程序中是可以獲取里面的按鈕的句柄的。一定要記住我們可以通過(guò)任務(wù)管理器來(lái)獲取我們打開(kāi)的窗口名稱,按鈕就是名稱,不是它的變量名稱。
/***********************/
FindWindowEx
函數(shù)功能:該函數(shù)獲得一個(gè)窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個(gè)函數(shù)查找子窗口,從排在給定的子窗口后面的下一個(gè)子窗口開(kāi)始。在查找時(shí)不區(qū)分大小寫(xiě)。
? ? 函數(shù)原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);
? ? 參數(shù):
? ? hwndParent:要查找子窗口的父窗口句柄。
? ? 如果hwnjParent為NULL,則函數(shù)以桌面窗口為父窗口,查找桌面窗口的所有子窗口。
? ? Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函數(shù)僅查找所有消息窗口。
? ? hwndChildAfter :子窗口句柄。查找從在Z序中的下一個(gè)子窗口開(kāi)始。子窗口必須為hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter為NULL,查找從hwndParent的第一個(gè)子窗口開(kāi)始。如果hwndParent 和 hwndChildAfter同時(shí)為NULL,則函數(shù)查找所有的頂層窗口及消息窗口。
? ? lpszClass:指向一個(gè)指定了類名的空結(jié)束字符串,或一個(gè)標(biāo)識(shí)類名字符串的成員的指針。如果該參數(shù)為一個(gè)成員,則它必須為前次調(diào)用theGlobaIAddAtom函數(shù)產(chǎn)生的全局成員。該成員為16位,必須位于lpClassName的低16位,高位必須為0。
? ? lpszWindow:指向一個(gè)指定了窗口名(窗口標(biāo)題)的空結(jié)束字符串。如果該參數(shù)為 NULL,則為所有窗口全匹配。返回值:如果函數(shù)成功,返回值為具有指定類名和窗口名的窗口句柄。如果函數(shù)失敗,返回值為NULL。
?
總結(jié)
以上是生活随笔為你收集整理的WindowsAPI-Findwindow函数和FindWindowEx用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《西线无战事》:合上书的那一刻:只想痛哭
- 下一篇: java信息管理系统总结_java实现科