首页 > 代码库 > WinSpy涉及的windows api

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

   根据桌面坐标获取到window的HWND。返回NULL表示没有窗口在该point下。

1.2 ClientToScreen

技术分享
BOOL ClientToScreen( 
HWND hWnd,       // handle to window
LPPOINT lpPoint  // screen coordinates);
View Code

  将客户端相对坐标转换为桌面坐标,是WindowFromPoint的前提。函数调用成功,返回非0值。否则,返回0.

1.3 GetParent

技术分享
HWND GetParent(  HWND hWnd );
View Code

   返回当前HWND的父窗口HWND。如果该窗口无父窗口或者函数调用失败,返回NULL。

1.4 GetWindowLong

技术分享
LONG GetWindowLong(   HWND hWnd,   int nIndex); 
View Code

  该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的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 ); 
View Code

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

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

1.6 EnumChildWindows

技术分享
1 BOOL EnumChildWindows(         
2     HWND hWndParent,
3     WNDENUMPROC lpEnumFunc,
4     LPARAM lParam
5 );
View Code

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

技术分享
1 BOOL CALLBACK EnumChildProc(          
2     HWND hwnd,
3     LPARAM lParam
4 );
View Code

 

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

 

  获得指定窗口所属的类的类名。第二个参数传入待接收类名的缓冲区,第三个参数为缓冲区长度。返回值为返回字符串的长度,返回值为0表示调用失败。

2.2 IsWindowUnicode

技术分享
BOOL IsWindowUnicode(   HWND hWnd);
View Code

 

  判断window的字符集是否是unicode。一个窗口的字符集是由函数RegisterClass决定的。如果窗口类是以ANSI版的RegisterClass ( RegjsterClassA)注册的,则窗口字符集是ANSI的;如果窗口类是以Unicode版的Registerclass( RegisterClassW)注册的,则窗口字符集是Unicode。

2.3 GetWindowRect

技术分享
BOOL GetWindowRect(   HWND hWnd,   LPRECT lpRect ); 
View Code

  返回指定窗口的边框矩形的窗口的左上角和右下角的屏幕坐标。屏幕坐标坐标系。

2.4 GetClientRect

技术分享
BOOL GetClientRect(   HWND hWnd,   LPRECT lpRect ); 
View Code

 

  返回指定窗口的边框矩形的窗口的左上角和右下角的客户区坐标。客户区坐标系。

2.5 OffsetRect

技术分享
1 BOOL OffsetRect(  
2     LPRECT lprc,  // rectangle 
3     int dx,           // horizontal offset
4     int dy            // vertical offset);
View Code

  指定的矩形移动到指定的位置,返回值非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);
View Code

  把相对于一个窗口的坐标空间的一组点映射成相对于另一窗口的坐标空间的一组点。如果函数调用成功,返回值的低位字是每一个源点的水平坐标的像素数目,以便计算每个目标点的水平坐标;高位字是每一个源点的垂直坐标的像素的数目,以便计算每个目标点的垂直坐标,如果函数调用失败,返回值为零。

  hWndFrom或To参数为NULL或HWND_DESKTOP,则假定这些点在屏幕坐标上。可代替ScreenToClient或ClientToScreen使用。

2.7 GetClassLong

技术分享
DWORD GetClassLong( 
  HWND hWnd, 
  int nIndex
);
View Code

 

  返回与指定窗口相关的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);
View Code

 

  将窗口属性表中的所有项列举出来,依次传送给指定的回调函数,直到列举到最后一项,或者回调函数返回FALSE为止。该函数提供了COM组件OLE相关的属性。 

5:Class页相关api

  核心api:GetClassLong、GetClassInfoEx

技术分享

5.1 GetClassInfoEx

技术分享
BOOL GetClassInfoEx(      
    HINSTANCE hinst,
    LPCTSTR lpszClass,
    LPWNDCLASSEX lpwcx
);
View Code

 

   查找窗口类的相关信息。第二个参数传入窗口类的名称,该类必须由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);
View Code

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

 

   找出某个窗口的创建者(线程或进程),返回创建者的进程ID和线程ID。返回值是线程ID,第二个参数返回进程ID。

7.3 GetModuleBaseName 

技术分享
DWORD WINAPI GetModuleBaseName(
  __in          HANDLE hProcess,
  __in          HMODULE hModule,
  __out         LPTSTR lpBaseName,
  __in          DWORD nSize
);
View Code

 

   第三个参数返回模块的名称。返回值表示写入缓冲区字符串的长度,0表示调用失败。

7.4 GetModuleFileNameEx

技术分享
DWORD WINAPI GetModuleFileNameEx(
  __in          HANDLE hProcess,
  __in          HMODULE hModule,
  __out         LPTSTR lpFilename,
  __in          DWORD nSize
);
View Code

 

   获取模块的全路径。返回值表示写入缓冲区字符串的长度,0表示调用失败。

 7.5 EnumProcessModules 

技术分享
BOOL WINAPI EnumProcessModules(
  __in          HANDLE hProcess,
  __out         HMODULE* lphModule,
  __in          DWORD cb,
  __out         LPDWORD lpcbNeeded
);
View Code

  枚举进程下所有的模块,用第二个参数接收。返回0表示调用失败。

 

WinSpy涉及的windows api