win32 获取窗口句柄的方法

2023-05-16

第一种方法是根据窗口句柄值获取窗口句柄

使用spy++获取指定窗口的窗口句柄值,因为句柄值是16进制数,所以前面加0x,然后进行强制转换为HWND类型。
HWND hWnd=(HWND)0x00280726;

 

第二种方法是使用FindWindow或者FindWindowEx根据窗口类名和窗口标题找到相应的窗口句柄

HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)    可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。
HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

 

第三种方法是获得当前鼠标位置的窗口句柄

BOOL GetCursorPos(LPPOINT lpPoint) //获取当前光标的位置,得到的坐标是以屏幕坐标表示
HWND WindowFromPoint(POINT& Point)

 

第四种方法是枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。

BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

 

BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)

BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)

 

例子:#include <iostream>
#include <windows.h>
using namespace std;
BOOL CALLBACK MyEnumProc(HWND hwnd,LPARAM lParam)
{
 char szTitle[100];
 memset(szTitle,0,sizeof(szTitle));
 GetWindowText(hwnd,szTitle,100);
 if(!strcmp(szTitle,"QQ2013"))
 {
  MessageBox(NULL,szTitle,szTitle,0);
  return FALSE;
 }
 return TRUE;
}
int main()
{
  BOOL ret=EnumWindows(MyEnumProc,0);//调用EnumWindows,传入MyEnumProc的函数地址作为第一个参数,
   return 0;
}

 

第五种方式根据进程名或进程ID获取窗口句柄

HANDLE GetProcessHandle(int nID)//通过进程ID获取进程句柄
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}

HANDLE GetProcessHandle(LPCTSTR pName)//通过进程名获取进程句柄
{
 HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if (INVALID_HANDLE_VALUE == hSnapshot)
 {
  return NULL;
 }
 PROCESSENTRY32 pe = { sizeof(pe) };
 BOOL fOk;
 for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
 {
  if (!_tcscmp(pe.szExeFile, pName))
  {
   CloseHandle(hSnapshot);
   return GetProcessHandle(pe.th32ProcessID);
  }
 }
 return NULL;
}

 

VC由进程ID获取窗口句柄 

HWND GetWindowHandleByPID(DWORD dwProcessID)
{
 HWND h = GetTopWindow(0);    
 while ( h )    
 {
  DWORD pid = 0;
        DWORD dwTheardId = GetWindowThreadProcessId( h,&pid); 
  if (dwTheardId != 0)   
  {
   if ( pid == dwProcessID/*your process id*/ )           
            {
                // here h is the handle to the window               
    return h; 
            }      
        }  
  h = GetNextWindow( h , GW_HWNDNEXT);    
    }
 return NULL;
}
HWND GetHwndByPid(DWORD ProcessId)//进程ID取窗口句柄    
{            
 WINDOWINFO WinInfo1[255];     
 HWND _hwnd=0;     
 DWORD aa=EnumWindowInfo(WinInfo1);     
 for(int i=0;i<aa;i++)     
 {     
  if (WinInfo1[i].dwProcessId==ProcessId)     
  {     
   _hwnd=WinInfo1[i].hwnd1;     
   if (0 ==::GetWindowLong(WinInfo1[i].hwnd1,GWL_HWNDPARENT))     
   {     
    return WinInfo1[i].hwnd1;
   }     
  }     
 }     
 return _hwnd;            
}    


回调函数找 
typedef struct tagWNDINFO

 DWORD dwProcessId; 
 HWND hWnd; 
} WNDINFO, *LPWNDINFO;  
BOOL CALLBACK YourEnumProc(HWND hWnd,LPARAM lParam) 

 DWORD dwProcessId; 
 GetWindowThreadProcessId(hWnd, &dwProcessId);
 LPWNDINFO pInfo = (LPWNDINFO)lParam;
 
 if(dwProcessId == pInfo->dwProcessId)
 { 
  pInfo->hWnd = hWnd;   
  return FALSE;  
 } 
 return TRUE;
}  
HWND GetProcessMainWnd(DWORD dwProcessId) 

 WNDINFO wi; 
 wi.dwProcessId = dwProcessId; 
 wi.hWnd = NULL; 
 EnumWindows(YourEnumProc,(LPARAM)&wi);
 return wi.hWnd;
}

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

win32 获取窗口句柄的方法 的相关文章

  • VS中空项目、win32项目、控制台程序的区别

    一 区别 xff08 1 xff09 Win32控制台程序 xff0c 没有界面 xff0c 只有命令符 生成的 exe 文件直接运行操作即可 xff08 2 xff09 Win32项目 xff0c 有界面 但是界面里面的控件 xff0c
  • vs 开发 win32 程序,调出控制台窗口,方便调试

    设置方法 项目 gt 属性 gt 生成事件 gt 后期生成事件 gt 命令行 中添加 editbin span class hljs constant SUBSYSTEM span class hljs symbol CONSOLE spa
  • Visual Studio 新建一个Win32控制台项目

    1 点击 文件 新建 项目 2 选好Win32控制台项目点击确定 3 点击击下一步 4 勾选好项目程序设置后点击完成 5 点击 本地 Windows 调试器即可调试程序
  • 常见 win32.com 操作

    import win32com client from win32api import RGB xlapp 61 win32com client gencache EnsureDispatch 34 Ket Application 34 x
  • win32+win64+linuxi686+linuxx86_64不同数据类型所占位数

    win32 43 win64 43 linuxi686 43 linuxx86 64不同数据类型所占位数
  • Dynamic Linking Error: Win32 Error 126问题排查

    如题所示 xff0c 这个问题是我在electron项目中使用ffi调用动态链接库出现的 xff0c 本机运行都好好的 xff0c 打包构建然后放到别的机器上运行出错 这个问题一度也让我很迷茫 xff0c 如果是路径导致的这个问题 xff0
  • win32汇编寄存器汇总

    32位CPU所含有的寄存器有 xff1a 4个数据寄存器 EAX EBX ECX和EDX 2个变址和指针寄存器 ESI和EDI 2个指针寄存器 ESP和EBP 6个段寄存器 ES CS SS DS FS和GS 1个指令指针寄存器 EIP 1
  • win32 获取窗口句柄的方法

    第一种方法是根据窗口句柄值获取窗口句柄 使用spy 43 43 获取指定窗口的窗口句柄值 xff0c 因为句柄值是16进制数 xff0c 所以前面加0x 然后进行强制转换为HWND类型 HWND hWnd 61 HWND 0x0028072
  • Win32环境下两种用于C++的线程同步类

    线程同步是多线程程序设计的核心内容 它的目的是正确处理多线程并发时的各种问题 例如线程的等待 多个线程访问同一数据时的互斥 防死锁等 Win32提供多种内核对象和手段用于线程同步 如互斥量 信号量 事件 临界区等 所不同的是 互斥量 信号量
  • mciSendString的介绍

    转载至 http blog sina com cn s blog 149e9d2ec0102wzcn html 使用MCI API 源文件中需要包含头文件Mmsystem h 在Project gt Settings gt Link gt
  • 通过文件夹文件获取文件夹大小

    思路就是便利文件夹下的每个文件 碰到子文件夹递归进去继续找文件 所有的文件大小累加起来 int GetFolderSize LPCTSTR szPath TCHAR szFileFilter 512 TCHAR szFilePath 512
  • C++ win32编程 02 常见消息

    02 常见消息 1 打印消息相关信息 1 1 将消息内容转化为字符串 第一步 定义字符串变量 用来保存转化后的消息 wchar t szInfo 300 定义消息内容变量 第二步 用宽字符格式化函数转化消息内容 wsprintf szInf
  • 几何画笔

    在看书时看到了这个概念 画笔可以分为几何画笔和装饰画笔 目前从CSDN以及MSDN上大致看了一下几何画笔的用法 代码如下 HPEN hPen NULL DWORD dwStyle PS GEOMETRIC PS DASHDOT PS END
  • OSG+MyGUI结合下中文输入的若干问题

    好久又没写文章了 经过这两天的研究 终于搞定了OSG MYGUI的中文输入问题 现在进行一下所遇问题的汇总 方便自己以后查阅 问题1 小键盘数字的输入问题 这个是很久以前解决的 osg并不能给你真正的小键盘输入值 还是得自己处理 代码片段1
  • WIN32 代码测试(Control)

    include
  • WIN32 资源

    首先解释一下句柄 win32中的句柄在数值上表示一个32位的数 用来标识应用程序 进程中不同对象以及同类对象中的不同实例 而所谓实例就是指被实例化的对象 实例化的过程就是通过类创建对象的过程 实例化对象的目地是为对象开辟内存空间 所以句柄是
  • Win32API学习笔记第三章

    这次记录的是鼠标与键盘的消息和部分相应API的使用如与标准 本人学的是Win程序设计第五版 有偏差 或哪里有不妥 欢迎大家给予斧正 一 键盘 初阶 Windows有8种不同的消息来传递不同的键盘事件 但是其中的大部分是我们一般不会去处理的
  • GDI 绘图

    目录 GDI 绘图 画点 画线 画封闭图形 画笔 画刷 其他 DC Device Context 绘图设备 HDC 绘图设备句柄 GDI Microsoft Graphics Device Interface Win32提供的绘图API G
  • windows 消息机制

    windows 操作系统是由事件驱动的 也叫消息机制 一般来说分为四步 用户动作也就是事件 gt windows 将事件翻译成消息 gt 将消息放入消息队列 gt 消息循环从消息队列中取出消息并发送给窗口处理程序 我们来看一下窗口最简单窗口
  • Win32 文件分割合并

    CFileSplitUtils h pragma once include

随机推荐

  • 利用Qt Phonon框架制作音视频播放器

    Phonon严格来说其实非为Qt的library xff0c Phonon原本就是KDE 4的开放源代码多媒体API xff0c 後来与Qt合并与开发 xff0c 所以简单来说就是Qt使用Phonon这个多媒体框架来提供一般影音多媒体档案的
  • 主设备号和次设备号

    Linux的设备管理是和文件系统紧密结合的 xff0c 各种设备都以文件的形式存放在 dev目录下 xff0c 称为设备文件 应用程序可以打开 关闭和读写这些设备文件 xff0c 完成对设备的操作 xff0c 就像操作普通的数据文件一样 为
  • Makefile中的wildcard用法

    在Makefile规则中 xff0c 通配符会被自动展开 但在变量的定义和函数引用时 xff0c 通配符将失效 这种情况下如果需要通配符有效 xff0c 就需要使用函数 wildcard xff0c 它的用法是 xff1a wildcard
  • GPIO

    一 什么是GPIO xff1f 首先应该理解什么是GPIO GPIO xff0c 英文全称为General Purpose IO ports xff0c 也就是通用IO口 在嵌入式系统中常常有数量众多 xff0c 但是结构却比较简单的外部设
  • UART

    一 S3C2410内置的UART控制器 S3C2410内部具有3个独立的UART控制器 xff0c 每个控制器都可以工作在Interrupt xff08 中断 xff09 模式或DMA xff08 直接内存访问 xff09 模式 xff0c
  • vivi源代码最为详细分析(二)

    现在进入bootloader之vivi分析的第二阶段 xff0c 这部分使用C语言实现 xff0c 部分代码采取内嵌汇编的方式 这里需要用到GNU GCC内嵌汇编 的知识 xff0c 这部分基础还没有具备 xff0c 需要学习 下面先按照流
  • vivi源代码最为详细分析(三)

    step 5 xff1a MTD设备初始化 关于什么是MTD xff0c 为什么要使用MTD xff0c MTD技术的架构是什么 xff0c 等等 xff0c 可以参考 Linux MTD源代码分析 xff08 作者 xff1a Jim Z
  • 【笔记】docker-compose.yml 文件更改后重新启动加载更改后的内容

    docker compose yml 文件更改后想使之立刻生效 xff0c 但是不想手动删除已经建立的 container 等信息可以运行下面命令 重新创建容器实现修改 docker compose up force recreate d
  • bootloader开发阶段总结以及可能会碰到的问题

    到今天 xff0c vivi源代码基本分析完毕 对bootloader有了更深层的认识 在此期间 xff0c 仔细阅读了毛德操 胡希明先生编著的 嵌入式系统 采用公开源代码和StrongARM XScale处理器 第七章 xff1a 嵌入式
  • 用模式一实现用户登录功能

    login jsp为显示登录表单和处理登录请求的页面 xff0c 登录成功后跳转到logonSuccess jsp页面 xff0c 登录失败时重新显示登录表单和失败的帮助信息 xff0c 以便用户重新登录 xff1b 如果已登录用户再次访问
  • UDP通信 (C语言实现)

    直接看代码吧 v乛 乛 udp server c 文件信息 文 件 名 udp server c 创 建 人 文件创建日期 年 月 日 描 述 UDP 回射服务器程序
  • jni中使用extern "C"的原因

    首先 cplusplus这个宏是微软自定义宏 xff0c 大小是个整数 xff1a cplusplus This macro is defined when the C 43 43 compiler is in use You can us
  • VmWare虚拟机设置ubuntu和windows之间的共享文件夹

    一般在进行编程作业的时候 xff0c 我们会采用 开发在Windows中编辑源代码 xff0c 在linux中编译 执行源代码 这往往需要需要将在Windows下编辑好的源代码上传到linux系统种进行编译 怎么来进行上传呢 xff1f 其
  • C++的最后一道坎|百万年薪的程序员

    导语 C 43 43 的起源可以追溯到 40 年前 xff0c 但它仍然是当今使用最广泛的编程语言之一 xff0c C 43 43 发明人Bjarne Stroustrup 一开始没想到 C 43 43 会获得如此大的成功 xff0c 他说
  • Modbus 协议

    1 主站 xff1a 可以进行读写操作 从站 xff1a 只能被动响应主站操作 2 一个 Modbus 网络只有一个主站 xff0c 可以多个从站 xff08 主站不用连在两端 xff09 485 通讯 1 接线 最多 254 个站 xff
  • 数据结构对齐

    xfeff xfeff 对齐的算法 xff1a 由于各个平台和编译器的不同 xff0c 现以本人使用的gcc version 3 2 2编译器 xff08 32位x86平台 xff09 为例子 xff0c 来讨论编译器对struct数据结构
  • 关于示波器测485串口波特率的使用方法总结

    之前没有用过示波器 xff0c 更不知道怎么来测试串口的波特率 xff0c 结果遇到一客户说我们产品的波特率达不到9600 xff0c 只有9100 xff0c 为了验证这一说法 xff0c 我们只能自己测试一下 说明 xff1a 产品通过
  • C语言对寄存器封装

    一 封装外设 用C语言代码把外设地址映射用宏定义封装 span class hljs comment 外设基地址 span span class hljs preprocessor define PERIPH BASE unsigned i
  • JavaJDK下载安装与环境配置(Windows 10 超详细的图文版教程 )

    前言 xff1a 对于很多初学者来说 xff0c 我想可能很多人都会遇到JDK环境变量的配置问题 明明就是按照度娘上的教程去一步步配置的 xff0c 但还是会有很多的人出现配置不成功的问题 所以今天在这里分享一下windows 10 系统下
  • win32 获取窗口句柄的方法

    第一种方法是根据窗口句柄值获取窗口句柄 使用spy 43 43 获取指定窗口的窗口句柄值 xff0c 因为句柄值是16进制数 xff0c 所以前面加0x 然后进行强制转换为HWND类型 HWND hWnd 61 HWND 0x0028072