WindowsAPI-Findwindow函数和FindWindowEx用法
1.函數說明:
FindWindow,Win32 API函數。
FindWindow函數返回與指定字符串相匹配的窗口類名或窗口名的最頂層窗口的窗口句柄。這個函數不會查找子窗口。
2.函數原型:
HWND FindWindow(? ?
??????????????LPCTSTR lpClassName,
? ???????????????LPCTSTR lpWindowName ? ? ? ?
????????????????);
3.參數說明:
lpClassName
指向一個以null結尾的、用來指定類名的字符串或一個可以確定類名字符串的原子。如果這個參數是一個原子,那么它必須是一個在調用此函數前已經通過GlobalAddAtom函數創建好的全局原子。這個原子(一個16bit的值),必須被放置在lpClassName的低位字節中,lpClassName的高位字節置零。
lpWindowName
指向一個以null結尾的、用來指定窗口名(即窗口標題)的字符串。如果此參數為NULL,則匹配所有窗口名。
4返回值:
如果函數執行成功,則返回值是擁有指定窗口類名或窗口名的窗口的句柄。
如果函數執行失敗,則返回值為?NULL?。可以通過調用GetLastError函數獲得更加詳細的錯誤信息。
5.使用示例:
HWND hWndRcv = ::FindWindow(NULL,"123");
if(hWndRcv != NULL)
{
???AfxMessageBox("找到123窗口");
}
/****************/
FindWindow(
lpClassName,??????? {窗口的類名}
lpWindowName: PChar {窗口的標題}
): HWND;????????????? {返回窗口的句柄; 失敗返回 0}
//FindWindowEx 比 FindWindow 多出兩個句柄參數:
FindWindowEx(
Parent: HWND;???? {要查找子窗口的父窗口句柄}
Child: HWND;????? {子窗口句柄}
ClassName: PChar; {}
WindowName: PChar {}
): HWND;
{
如果 Parent 是 0, 則函數以桌面窗口為父窗口, 查找桌面窗口的所有子窗口;
如果 是 HWND_MESSAGE, 函數僅查找所有消息窗口;
子窗口必須是 Parent 窗口的直接子窗口;
如果 Child 是 0, 查找從 Parent 的第一個子窗口開始;
如果 Parent 和 Child 同時是 0, 則函數查找所有的頂層窗口及消息窗口.
}
--------------------------------------------------------------------------------
//測試1: 試著找找新建程序主窗口的句柄
var
h: HWND;
begin
{現在我們知道窗口的標題是: Form1、窗口的類名是: TForm1}
h := FindWindow('TForm1', 'Form1');
ShowMessage(IntToStr(h));????? {656180; 這是隨機, 每次啟動窗口肯定不一樣}
{假如不知道類名}
h := FindWindow(nil, 'Form1');
ShowMessage(IntToStr(h));????? {656180}
{假如不知道標題名}
h := FindWindow('TForm1', nil);
ShowMessage(IntToStr(h));????? {656180}
{其實這個窗口的句柄不就是 Self.Handle 嗎}
ShowMessage(IntToStr(Handle)); {656180}
end;
--------------------------------------------------------------------------------
//測試2: 找計算器窗口的句柄(先打開計算器)
var
h: HWND;
begin
{如果不是簡體中文系統, 這樣可能不靈}
h := FindWindow(nil, '計算器');
ShowMessage(IntToStr(h)); {1508334}
{最好這樣, 但你得提前知道計算器窗口的類名是: SciCalc}
h := FindWindow('SciCalc', nil);
ShowMessage(IntToStr(h)); {1508334}
end;
/******************************/
1 FindWindow函數:
函數功能:該函數獲得一個頂層窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個函數不查找子窗口。在查找時不區分大小寫。
函數型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
參數:
IpClassName :指向一個指定了類名的空結束字符串,或一個標識類名字符串的成員的指針。如果該參數為一個成員,則它必須為前次調用theGlobafAddAtom函數產生的全局成員。該成員為16位,必須位于IpClassName的低 16位,高位必須為 0。
IpWindowName:指向一個指定了窗口名(窗口標題)的空結束字符串。如果該參數為空,則為所有窗口全匹配。
返回值:如果函數成功,返回值為具有指定類名和窗口名的窗口句柄;如果函數失敗,返回值為NULL
2 FindWindowEx函數:
函數功能:該函數獲得一個窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個函數查找子窗口,從排在給定的子窗口后面的下一個子窗口開始。在查找時不區分大小寫。
函數原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);
參數:
hwndParent:要查找子窗口的父窗口句柄。
如果hwnjParent為NULL,則函數以桌面窗口為父窗口,查找桌面窗口的所有子窗口。
Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函數僅查找所有消息窗口。
hwndChildAfter :子窗口句柄。查找從在Z序中的下一個子窗口開始。子窗口必須為hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter為NULL,查找從hwndParent的第一個子窗口開始。如果hwndParent 和 hwndChildAfter同時為NULL,則函數查找所有的頂層窗口及消息窗口。
lpszClass:指向一個指定了類名的空結束字符串,或一個標識類名字符串的成員的指針。如果該參數為一個成員,則它必須為前次調用theGlobaIAddAtom函數產生的全局成員。該成員為16位,必須位于lpClassName的低16位,高位必須為0。
lpszWindow:指向一個指定了窗口名(窗口標題)的空結束字符串。如果該參數為 NULL,則為所有窗口全匹配。返回值:如果函數成功,返回值為具有指定類名和窗口名的窗口句柄。如果函數失敗,返回值為NULL。
3命名空間 :
using System.Runtime.InteropServices;
4編程實例:
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); ? ? //發送點擊按鈕的消息 ?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.WriteLine("沒有找到子窗口");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine("沒有找到窗口");
? ? ? ? ? ? }
? ? ? ? ? ? Console.ReadKey();
? ? ? ? }
經過調試可得上面的子窗口的句柄好像獲取不到,不知道什么原因,但是呢,在自己創建的winfrom程序中是可以獲取里面的按鈕的句柄的。一定要記住我們可以通過任務管理器來獲取我們打開的窗口名稱,按鈕就是名稱,不是它的變量名稱。
/***********************/
FindWindowEx
函數功能:該函數獲得一個窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個函數查找子窗口,從排在給定的子窗口后面的下一個子窗口開始。在查找時不區分大小寫。
? ? 函數原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);
? ? 參數:
? ? hwndParent:要查找子窗口的父窗口句柄。
? ? 如果hwnjParent為NULL,則函數以桌面窗口為父窗口,查找桌面窗口的所有子窗口。
? ? Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函數僅查找所有消息窗口。
? ? hwndChildAfter :子窗口句柄。查找從在Z序中的下一個子窗口開始。子窗口必須為hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter為NULL,查找從hwndParent的第一個子窗口開始。如果hwndParent 和 hwndChildAfter同時為NULL,則函數查找所有的頂層窗口及消息窗口。
? ? lpszClass:指向一個指定了類名的空結束字符串,或一個標識類名字符串的成員的指針。如果該參數為一個成員,則它必須為前次調用theGlobaIAddAtom函數產生的全局成員。該成員為16位,必須位于lpClassName的低16位,高位必須為0。
? ? lpszWindow:指向一個指定了窗口名(窗口標題)的空結束字符串。如果該參數為 NULL,則為所有窗口全匹配。返回值:如果函數成功,返回值為具有指定類名和窗口名的窗口句柄。如果函數失敗,返回值為NULL。
?
總結
以上是生活随笔為你收集整理的WindowsAPI-Findwindow函数和FindWindowEx用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《西线无战事》:合上书的那一刻:只想痛哭
- 下一篇: WebForm连接数据库实例