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函数用于给指定窗口的窗口过程发消息。原型如下:

1 LRESULT CallWindowProc(
2     WNDPROC lpPrevWndFunc,
3     HWND hWnd,
4     UINT Msg,
5     WPARAM wParam,
6     LPARAM lParam ); 

  GWL_HINSTANCE:获得应用事例的句柄。

  GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。 
  GWL_ID:获得窗口标识。 
  GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。 
  在hWnd参数标识了一个对话框时也可用下列值: 
  DWL_DLGPROC:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。 
  DWL_MSGRESULT:获得在对话框过程中一个消息处理的返回值。 
  DWL_USER:获得应用程序私有的额外信息,例如一个句柄或指针。

1.5 SetWindowLong

1 LONG SetWindowLong(
2 HWND hWnd,
3 int nIndex,
4 LONG dwNewLong); 

  与GetWindowLong对应,用于修改窗口的属性。属性类型与GetWindowLong一样。返回值0表示调用失败,用GetLastError查询错误信息。

1.6 EnumChildWindows

1 BOOL EnumChildWindows(
2     HWND hWndParent,
3     WNDENUMPROC lpEnumFunc,
4     LPARAM lParam
5 );

  用于枚举父窗口下所有的子窗口,通过回掉函数WNDENUMPROC lpEnumFunc处理子窗口。函数将堵塞直至所用子窗口被枚举,或者回掉函数返回FALSE。回掉函数的格式为:

1 BOOL CALLBACK EnumChildProc(
2     HWND hwnd,
3     LPARAM lParam
4 );

2:General页相关api

  general页包含了窗口的一些基本信息,核心api有GetClassName、IsWindowUnicode、GetWindowRect、GetClientRect、OffsetRect、MapWindowPoints、GetClassLong。

2.1 GetClassName

1 int GetClassName(
2 HWND hWnd,
3 LPTSTR lpClassName,
4 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

1 BOOL OffsetRect(
2     LPRECT lprc,  // rectangle
3     int dx,           // horizontal offset
4     int dy            // vertical offset);

  指定的矩形移动到指定的位置,返回值非0成功,0失败。

2.6 MapWindowPoints

1 int MapWindowPoints(
2   HWND hWndFrom,     // handle to source window
3   HWND hWndTo,       // handle to destination window
4   LPPOINT lpPoints,  // array of points to map
5   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位值。

GCSW原子:获得一个唯一标识窗口类的原子值,该值与RegisterClassEx函数的返回值相同。

GCL_CBWNDEXTRA:获得与类中的每个窗口相关的额外窗口中内存空间的字节大小,进入该存储空间的方法请参看GetWindowLong。

GCL_HBRBACKGROUND:获得与类有关的背景刷子的句柄。

GCL_HCURSOR:获得与类有关的光标的句柄。

GCL_HICON:获得与类有关的图标的句柄。

GCL_HICONSM:获得与类有关的小图标的句柄。

GCL_HMOUDLE:获得注册该类的模块的句柄。

GCL_MENUNAME:获得菜单名字符串的地址,该字符串标识了与类有关的菜单资源。

GCL_STYLE:获得窗口类的风格位。

GCL_WNDRPOC:获得与类有关的窗口过程的地址。

返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。

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
);

  第三个参数返回模块的名称。返回值表示写入缓冲区字符串的长度,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表示调用失败。

时间: 2024-08-03 18:22:03

WinSpy涉及的windows api的相关文章

Windows API教程文件系统

本篇文章主要介绍了"Windows API教程文件系统",主要涉及到Windows API教程文件系统方面的内容,对于Windows API教程文件系统感兴趣的同学可以参考一下. 索引 概念简介 文件对象 文件流 文件句柄 文件指针 文件系统操作 常见 API 高级文件操作 本讲程序功能列表 CreateFile 具体参数 返回值 DeleteFile 参数 返回值 CopyFile.MoveFile.FindFirstFile ReadFile GetCurrentDirectory

Delphi Windows API判断文件共享锁定状态

一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定数据是否可读或可写,从而为开发出健壮的程序提供切实依据.   同样,在Windows中,文件可以共享模式打开,它也涉及到锁的操作问题.根据Windows中文件共享时加锁范围的大小,锁可分为全局锁和局部锁:全局锁以锁定文件全部内容为特征,而局部锁以锁定文件的局部内容为特征,且文件的锁定区域不可重复.根

使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程

http://bbs.pediy.com/showthread.php?p=1354999 标 题: [原创]使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程.作 者: shayi时 间: 2015-02-12,05:19:54链 接: http://bbs.pediy.com/showthread.php?t=197829 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. (本文同步更

C#调用windows API的一些方法

使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2.  调用 COM 对象上的接口方法 我主要讨论从dll中导出函数,基本步骤如下: 1.使用 C# 关键字 static 和 extern 声明方法. 2.将 DllImport 属性附加到该方法.DllImport 属性允许您指定包含该方法的 DLL 的名称. 3.如果需要,为方法的参数和返回值指定

C#调用Windows API详解(上)

以前我写过通过WMI来获取有关系统信息的系列文章,确实通过WMI能够恨轻易地实现很多我们想实现的功能,不过有些情况下我们很难利用WMI来实现一些 复杂的功能,比如最近我做的一个项目,其中有一个功能就是要更改系统当前时间,利用WMI就很难实现(我没有找到相关的方法),还有一些其它方面的功能, 也比较难以通过WMI来实现,也许是WMI需要较高的权限才能执行的原因吧.所以,尽管我们不愿意,但是又不得不通过调用Windows 的API来实现.本文的目的就是讲述如何在C#中调用Windows的系统API.

使用C#调用windows API(从其它地方总结来的,以备查询) -转

使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2.  调用 COM 对象上的接口方法 我主要讨论从dll中导出函数,基本步骤如下: 1.使用 C# 关键字 static 和 extern 声明方法. 2.将 DllImport 属性附加到该方法.DllImport 属性允许您指定包含该方法的 DLL 的名称. 3.如果需要,为方法的参数和返回值指定

Windows API参考大全新编

书名:新编Windows API参考大全 作者:本书编写组 页数:981页 开数:16开 字数:2392千字 出版日期:2000年4月第二次印刷 出版社:电子工业出版社 书号:ISBN 7-5053-5777-8 定价:98.00元 内容简介 作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的.本书首先对Win32 API函数做完整的概述:然后收录五大类函数:窗口管理.图形设备接口.系统服务.国际特性以及网络服务:在附录部分,讲解如何

Windows API Hook

原文地址:http://blog.sina.com.cn/s/blog_628821950100xmuc.html 原文对我的帮助极大,正是因为看了原文,我才学会了HOOK,鉴于原文的排版不是很好, 又没有原工程例子源码下载,因此我决定对其重新整理,文章后面附有我测试时的工程源码下载地址. 注:我测试的环境为Win7+VS2008+MFC 原文出处,好像是这篇:http://blog.csdn.net/glliuxueke/article/details/2702608      //后来才看到

C、C++控制台程序、Windows API程序、MFC程序理解与比较

在编程语言中,函数是一个很重要的概念,其身影无处不在.在面向过程的编程方式中,函数更是程序的基本构建模块,在面向对象的编程方式中,函数演变为类或对象的成员(当然也可以使用与类无关的函数).函数由函数头和函数体组成.函数头包括域属性(如external.static或类域).返回值类型.函数名.及参数.域属性包括其在多文件编程中的可见范围,是否是属于某一个类的成员?返回值类型是指函数返回的值的具体数据类型(可以理解为函数输出的一部分).函数名是函数保存在内存代码区的首地址,用于函数的调用及函数指针