WindowsAPI-Findwindow函数和FindWindowEx用法

2023-05-16

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。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WindowsAPI-Findwindow函数和FindWindowEx用法 的相关文章

随机推荐

  • 多线程下局部变量与全局变量的使用及区别

    局部变量是在栈中运行 每个运行的线程都有自己的堆栈 别的线程无法访问得到 xff0c 因此我们说 xff0c 局部变量是 安全 的 全局变量是在堆中运行 堆是对所有的线程都可见的 因此在两个以上的线程访问全局变量时 xff0c 就会出现所谓
  • MFC中Windows窗口消息循环及多线程之间关系

    Windows中一个进程可以包含多个线程 xff0c 由多个线程组成 在Windows应用程序中 xff0c 窗体是由 UI线程 xff08 User Interface Thread xff09 的特殊类型的线程创建的 一个UI线程包含一
  • c#中Show和Showdialog的区别分析

    简单地说他们的区别就是show弹出来的窗体和父窗体 xff08 上一个窗体的简称 xff09 是属于同一等级的 xff0c 这两个窗体可以同时存在而且可以随意切换 xff0c 但是showdialog弹出来的窗体就不能这样 xff0c 他永
  • 模态对话框和非模态对话框的消息循环分析

    1 非模态对话框和父窗口共享当前线程的消息循环 2 模态对话框新建一个新的消息循环 xff0c 并由当前消息循环派发消息 xff0c 而父窗口 模态对话框屏蔽了用户对它父窗口的操作 xff0c 但是不是在消息循环里面屏蔽 xff0c 所以给
  • MFC中实现模态对话框的结构与原理

    1 模态对话框 在涉及GUI程序开发的过程中 xff0c 常常有模态对话框以及非模态对话框的概念 模态对话框 xff1a 在子界面活动期间 xff0c 父窗口是无法进行消息响应 独占用户输入 非模态对话框 xff1a 各窗口之间不影响 模态
  • 深入理解MFC消息循环和消息泵的原理

    首先 xff0c 应该清楚MFC的消息循环 GetMessage PeekMessage xff0c 消息泵 CWinThread PumpMessage 和MFC的消息在窗口之间的路由是两件不同的事情 在MFC的应用程序中 应用程序类基于
  • 窗口结束后资源释放不掉问题解决办法

    net类库已经帮助我们实现了窗口的关闭 xff0c 如果此窗口是系统的主窗口 xff0c 关闭此窗口即应该退出了整个应用程序 但事实上有时候并不是这样的 xff0c 关闭窗口 xff0c 只是停止了当前窗口的消息循环 系统主窗口 xff0c
  • 模态对话框的消息循环原理及分析笔记

    简述 xff1a APP消息循环和模态对话框中局部消息循环的关系 根据上图可以看出 xff0c 在APP的消息循环再派发ONOK消息后 xff0c 调用ModalDlg的响应函数 xff0c pWnd gt OnOk 在该消息中 xff0c
  • 数据库常用命令笔记

    一 xff1a 增 1 INSERT INTO table name 列1 列2 VALUES 值1 值2 2 insert into user tbl select from user tbl where user name 61 39
  • MFC中动态创建控件以及添加事件响应

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法 xff0c 分享给大家供大家参考 具体实现方法如下 xff1a 动态控件是指在需要时由Create 创建的控件 xff0c 这与预先在对话框中放置的控件是不同的 一 创建动态控件 xf
  • vnc好用吗,vnc是什么,vnc好用吗

    VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件 xff0c 远程控制能力强大 xff0c 高效实用 xff0c 其性能可以和Windows 和 MAC 中的任何远程控制软件媲美 VNC Virtual Network
  • MFC框架1

    第一点 xff1a 类别型录网的搭建 xff1a 类别型录网搭建的目的是为了实现所谓的 34 执行期类型识别 34 xff0c 也就是在程序运行的时候识别出某个对象是否是某个类的实例 基类也可以 这里还不是很明白为什么需要实现 34 执行期
  • MFC框架简介2

    MFC框架简介 一 MFC框架 MFC库是开发Windows应用程序的C 43 43 接口 MFC提供了面向对象的框架 xff0c 采用面向对象技术 xff0c 将大部分的Windows API 封装到C 43 43 类中 xff0c 以类
  • MFC的框架程序分析3

    本文将剖析基于MFC的框架程序 xff0c 探讨MFC框架程序的内部组织结构 xff0c MFC是微软为了简化程序员的开发工作而设计的一套c 43 43 类集合 xff0c 利用这些类有 效地帮助程序员完成windows应用程序开发 代码结
  • MFC框架结构简述

    现在直接给出MFC程序执行顺序 xff0c 但着重分析其运行机制和功能分析 xff0c 其流程是 theApp全局对象定义 gt TestApp构造函数 gt WinMain函数 在执行theApp对象的构造函数之前先执行CWinApp基类
  • MFC框架机制详细论述

    1 1 Windows消息机制要点 1 1 1 窗口过程 每个窗口会有一个称为窗口过程的回调函数 WndProc xff0c 它带有四个参数 xff0c 分别为 xff1a 窗口句柄 Window Handle 消息ID Message I
  • c#中WinForm中拖拽窗体实现移动功能(无边框模态窗体)

    在WindowsForm 应用程序中 如果将窗体的FormBorderStyle属性设置为none 这时 用鼠标拖拽窗体时就无法实现移动的功能了 xff0c 下面就是解决方案 在FormBordeStyle属性设置为none的窗体的后台代码
  • 关于SetCapture() 和 ReleaseCapture()的用法

    MSND中对SetCapture 函数的说明为 xff1a 该函数在属于当前线程的指定窗口里设置鼠标捕获 一旦窗口捕获了鼠标 xff0c 所有鼠标输入都针对该窗口 xff0c 无论光标是否在窗口的边界内 同一时刻只能有一个窗口捕获鼠标 如果
  • c# Invoke和BeginInvoke 区别详解

    Control Invoke 方法 Delegate 在拥有此控件的基础窗口句柄的线程上执行指定的委托 Control BeginInvoke 方法 Delegate 在创建控件的基础句柄所在线程上异步执行指定委托 以下为实际应用中碰到的问
  • WindowsAPI-Findwindow函数和FindWindowEx用法

    1 函数说明 FindWindow xff0c Win32 API函数 FindWindow函数返回与指定字符串相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄 这个函数不会查找子窗口 2 函数原型 xff1a HWND FindWindow