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}writeline函数
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。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论