WinSpy涉及的windows api
WinSpy涉及的windows api
WinSpy是仿造微软Spy++的开源项目,但只涉及Spy++的窗口句柄、窗口的属性、styles、类名子窗口、进程线程信息等查找功能。功能虽然不算强大,但涉及到很多windows api,是了解windows api的一个有用工具。WinSpy界面截图如下:

1:拖拽瞄准镜图标获取窗口的HWND
核心api:ClientToScreen、WindowFromPoint、EnumChildWindows、GetParent、GetWindowLong、SetWindowLong
1.1 WindowFromPoint
HWND WindowFromPoint(POINT Point);
根据桌面坐标获取到window的HWND。返回NULL表示没有窗口在该point下。
1.2 ClientToScreen
BOOL ClientToScreen(
HWND hWnd, // handle to window
LPPOINT lpPoint // screen coordinates);
将客户端相对坐标转换为桌面坐标,是WindowFromPoint的前提。函数调用成功,返回非0值。否则,返回0.
1.3 GetParent
HWND GetParent( HWND hWnd );
返回当前HWND的父窗口HWND。如果该窗口无父窗口或者函数调用失败,返回NULL。
1.4 GetWindowLong
LONG GetWindowLong( HWND hWnd, int nIndex);
该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值(该整形值也可用于传入的函数指针或窗口过程地址)。调用成功返回32位整形值,失败返回0.可用GetLastError获取失败信息。可获取的窗口信息的类型如下:
GWL_EXSTYLE;获得扩展窗口风格。
GWL_STYLE:获得窗口风格。
GWL_WNDPROC:获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用CallWindowProc函数调用窗口过程,CallWindowProc函数用于给指定窗口的窗口过程发消息。原型如下:
LRESULT CallWindowProc(
WNDPROC lpPrevWndFunc,
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam );
GWL_HINSTANCE:获得应用事例的句柄。
GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。
GWL_ID:获得窗口标识。
GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。
在hWnd参数标识了一个对话框时也可用下列值:
DWL_DLGPROC:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。
DWL_MSGRESULT:获得在对话框过程中一个消息处理的返回值。
DWL_USER:获得应用程序私有的额外信息,例如一个句柄或指针。
1.5 SetWindowLong
LONG SetWindowLong(
HWND hWnd,
int nIndex,
LONG dwNewLong);
与GetWindowLong对应,用于修改窗口的属性。属性类型与GetWindowLong一样。返回值0表示调用失败,用GetLastError查询错误信息。
1.6 EnumChildWindows
BOOL EnumChildWindows(
HWND hWndParent,
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);
用于枚举父窗口下所有的子窗口,通过回掉函数WNDENUMPROC lpEnumFunc处理子窗口。函数将堵塞直至所用子窗口被枚举,或者回掉函数返回FALSE。回掉函数的格式为:
BOOL CALLBACK EnumChildProc(
HWND hwnd,
LPARAM lParam
);
2:General页相关api
general页包含了窗口的一些基本信息,核心api有GetClassName、IsWindowUnicode、GetWindowRect、GetClientRect、OffsetRect、MapWindowPoints、GetClassLong。

2.1 GetClassName
int GetClassName(
HWND hWnd,
LPTSTR lpClassName,
int nMaxCount);
获得指定窗口所属的类的类名。第二个参数传入待接收类名的缓冲区,第三个参数为缓冲区长度。返回值为返回字符串的长度,返回值为0表示调用失败。
2.2 IsWindowUnicode
BOOL IsWindowUnicode( HWND hWnd);
判断window的字符集是否是unicode。一个窗口的字符集是由函数RegisterClass决定的。如果窗口类是以ANSI版的RegisterClass ( RegjsterClassA)注册的,则窗口字符集是ANSI的;如果窗口类是以Unicode版的Registerclass( RegisterClassW)注册的,则窗口字符集是Unicode。
2.3 GetWindowRect
BOOL GetWindowRect( HWND hWnd, LPRECT lpRect );
返回指定窗口的边框矩形的窗口的左上角和右下角的屏幕坐标。屏幕坐标坐标系。
2.4 GetClientRect
BOOL GetClientRect( HWND hWnd, LPRECT lpRect );
返回指定窗口的边框矩形的窗口的左上角和右下角的客户区坐标。客户区坐标系。
2.5 OffsetRect
BOOL OffsetRect(
LPRECT lprc, // rectangle
int dx, // horizontal offset
int dy // vertical offset);
指定的矩形移动到指定的位置,返回值非0成功,0失败。
2.6 MapWindowPoints
int MapWindowPoints(
HWND hWndFrom, // handle to source window
HWND hWndTo, // handle to destination window
LPPOINT lpPoints, // array of points to map
UINT cPoints // number of points in array);
把相对于一个窗口的坐标空间的一组点映射成相对于另一窗口的坐标空间的一组点。如果函数调用成功,返回值的低位字是每一个源点的水平坐标的像素数目,以便计算每个目标点的水平坐标;高位字是每一个源点的垂直坐标的像素的数目,以便计算每个目标点的垂直坐标,如果函数调用失败,返回值为零。
hWndFrom或To参数为NULL或HWND_DESKTOP,则假定这些点在屏幕坐标上。可代替ScreenToClient或ClientToScreen使用。
2.7 GetClassLong
DWORD GetClassLong(
HWND hWnd,
int nIndex
);
返回与指定窗口相关的WNDCLASSEX结构的指定32位值。
3:Styles页相关api

4:Properities页相关api
核心api:EnumPropsEx

4.1 EnumPropsEx
int EnumPropsEx(
HWND hWnd,
PROPENUMPROCEX lpEnumFunc,
LPARAM lParam);
将窗口属性表中的所有项列举出来,依次传送给指定的回调函数,直到列举到最后一项,或者回调函数返回FALSE为止。该函数提供了COM组件OLE相关的属性。
5:Class页相关api
核心api:GetClassLong、GetClassInfoEx

5.1 GetClassInfoEx
BOOL GetClassInfoEx(
HINSTANCE hinst,
LPCTSTR lpszClass,
LPWNDCLASSEX lpwcx
);
查找窗口类的相关信息。第二个参数传入窗口类的名称,该类必须由RegisterClass或RegisterClassEx注册过。第三个参数用于接收类信息。
6:Windows页相关api

核心api:EnumChildWindows、GetParent
7:Process页相关api

核心api:OpenProcess、GetWindowThreadProcessId、GetModuleBaseName 、GetModuleFileNameEx、EnumProcessModules
7.1 OpenProcess
HANDLE OpenProcess( DWORD fdwAccess, BOOL fInherit, DWORD IDProcess);
OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。参数如下取值:
dwDesiredAccess:想拥有的该进程访问权限
PROCESS_ALL_ACCESS //所有能获得的权限
PROCESS_CREATE_PROCESS //需要创建一个进程
PROCESS_CREATE_THREAD //需要创建一个线程
PROCESS_DUP_HANDLE //重复使用DuplicateHandle句柄
PROCESS_QUERY_INFORMATION //获得进程信息的权限,如它的退出代码、优先级
PROCESS_QUERY_LIMITED_INFORMATION /*获得某些信息的权限,如果获得了PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限*/
PROCESS_SET_INFORMATION //设置某些信息的权限,如进程优先级
PROCESS_SET_QUOTA //设置内存限制的权限,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME //暂停或恢复进程的权限
PROCESS_TERMINATE //终止一个进程的权限,使用TerminateProcess
PROCESS_VM_OPERATION //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory)
PROCESS_VM_READ //读取进程内存空间的权限,可使用ReadProcessMemory
PROCESS_VM_WRITE //读取进程内存空间的权限,可使用WriteProcessMemory
SYNCHRONIZE //等待进程终止
bInheritHandle:表示所得到的进程句柄是否可以被继承
dwProcessId:被打开进程的PID
返回值为指定进程的句柄。如失败,返回值为NULL,可调用GetLastError()获得错误代码。
7.2 GetWindowThreadProcessId
DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId );
找出某个窗口的创建者(线程或进程),返回创建者的进程ID和线程ID。返回值是线程ID,第二个参数返回进程ID。
7.3 GetModuleBaseName
DWORD WINAPI GetModuleBaseName(
__in HANDLE hProcess,
__in HMODULE hModule,
__out LPTSTR lpBaseName,
__in DWORD nSize
);
第三个参数返回模块的名称。第二个参数如果是NULL,函数返回文件名。返回值表示写入缓冲区字符串的长度,0表示调用失败。
7.4 GetModuleFileNameEx
DWORD WINAPI GetModuleFileNameEx(
__in HANDLE hProcess,
__in HMODULE hModule,
__out LPTSTR lpFilename,
__in DWORD nSize
);
获取模块的全路径。返回值表示写入缓冲区字符串的长度,0表示调用失败。
7.5 EnumProcessModules
BOOL WINAPI EnumProcessModules(
__in HANDLE hProcess,
__out HMODULE* lphModule,
__in DWORD cb,
__out LPDWORD lpcbNeeded
);
枚举进程下所有的模块,用第二个参数接收。返回0表示调用失败。
WinSpy涉及的windows api的更多相关文章
- Windows API教程文件系统
本篇文章主要介绍了"Windows API教程文件系统",主要涉及到Windows API教程文件系统方面的内容,对于Windows API教程文件系统感兴趣的同学可以参考一下. ...
- C#调用windows API的一些方法
使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. ...
- Delphi Windows API判断文件共享锁定状态(OpenFile和CreateFile两种方法)
一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...
- Delphi Windows API判断文件共享锁定状态(使用OpenFile来判断)
一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...
- Windows API Hook
原文地址:http://blog.sina.com.cn/s/blog_628821950100xmuc.html 原文对我的帮助极大,正是由于看了原文.我才学会了HOOK.鉴于原文的排版不是非常好, ...
- 使用windows api函数捕获SAP session的左下角消息句柄
背景:SAP session的左下角消息非常有用,我们在做SAP的自动化脚本时可以设法读到这个消息的内容,作为程序后续动作的判断条件.如下图: 比如小爬之前给财务的同事制作了一个批量导出 ...
- [Windows] Windows API 串口通信
Windows 中通过Windows API 进行串口通信主要有以下步骤: 打开串口 配置串口 读写串口 关闭串口 打开串口 关键API: CreateFile Windows 中进行设备的操作,第一 ...
- C# Windows API
API:应用程序接口(API:Application Program Interface)应用程序接口(API:application programming interface)是一组定义.程序及协 ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
随机推荐
- 解密:LL与LR解析 1(译)
解密:LL与LR解析 1 作者:Josh Haberman 翻译:杨贵福 由于GFW,我无法联系到作者,所以没有授权,瞎翻译的.原文在这里[http://blog.reverberate.org/20 ...
- 用友CDM系统,将货位间商品移库单(一步)修改为内调出入库单(一步)方法使用
客户一般只购买CDM供应链系统,但是只买供应链模块不能进行内调等操作,据说插件将近15万(坑爹~~~) 货位间商品移库单和内调差不多,区别是货位间移库默认只能选择登陆账号所属机构的货位. 解决方案:分 ...
- Linux进程分配内存的两种方式--brk() 和mmap()
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...
- 怎样清除SWAP里的文件
在vim 编辑一个文件时断了网,文件就留在SWAP里,但我再vim这个文件保存后,再打开时又提示SWAP里有这文件了,此时swapoff -a后再ls -al查看,把文件所在目录里*.swp结尾的文件 ...
- Kettle的应用——对mysql数据进行表输入与导出
Kettle的应用——对mysql数据进行表输入与导出 1. 下载好kettle解压包 网址:http://sourceforge.net/projects/pentaho/files/Data%20 ...
- ESLint--定制你的代码规则
简介 ESLint是一个开源的项目,由Nicholas C. Zakas(<JavaScript高级程序设计>作者)于2013年六月创建.它的目标是为JavaScript提供一个完全可配置 ...
- 【.NET】字符串处理类库
类名:DealString,方法清单列好在头上. /// 1.截取字符串,最后加3个小数点 /// 2.获得指定Url的参数的string类型值 /// 3.判断数据类型 /// 4.过滤JS标记 / ...
- http缓存与cdn相关技术
阅读目录 一 http缓存 二.Http缓存概念解析 三.cdn相关技术 摘要:最近要做这个主题的组内分享,所以准备了一个星期,查了比较多的资料.准备的过程虽然很烦很耗时间,不过因为需要查很多的资料, ...
- SQLServer批量更新
两种写法,暂未知道区别 1. UPDATE aSET a.resblockid = ( SELECT b.resblockId FROM yyy.dbo.yyy b WHERE a.unitId = ...
- PHP定义静态方法的原则
与实例逻辑无关 与类逻辑有关 静态类本质上跟纯函数没区别. 1.static方法是类中的一个成员方法,属于整个类,即使不用创建任何对象也可以直接调用! 2.静态方法效率上要比实例化高,静态方法的缺点是 ...