- C++ 黑客编程揭秘与防范(第3版)
- 冀云
- 864字
- 2020-06-27 17:48:50
1.1.2 对“消息测试”程序代码的解释
上面的代码中要学习的API函数有两个,分别是FindWindow()和SendMessage()。下面看一下它们在MSDN中的定义。
FindWindow()函数的定义如下:
HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName );
FindWindow()函数的功能是,通过指定的窗口类名(lpClassName)或窗口标题(lpWindowName)查找匹配的窗口并返回最上层的窗口句柄。简单理解就是,通过指定的窗口名(窗口名相对于窗口类来说要直观些,因此往往使用的是窗口名)返回窗口句柄。FindWindow()函数有两个参数,分别是lpClassName和lpWindowName。通过前面的描述,该函数通常使用的是第2个参数lpWindowName,该参数是指定窗口的名称。在例子代码中,为程序指定的窗口名是“无标题—记事本”。“无标题—记事本”是记事本程序打开后的默认窗口标题,当FindWindow()找到该窗口时,会返回它的窗口句柄。例子代码中也使用了lpClassName(窗口类名),在窗口的名称会改变的情况下,只能通过窗口类名来获取窗口的句柄了。
当使用FindWindow()函数获取窗口句柄时,指定窗口名是比较直观和容易的。但是,如果窗口名经常发生变化时,那么就不得不使用窗口类名了。
使用FindWindow()函数返回的窗口句柄是为了给SendMessage()函数来使用的。
SendMessage()函数的定义如下:
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
该函数的作用是根据指定窗口句柄将消息发送给指定的窗口。该函数有4个参数,第1个参数hWnd是要接收消息的窗口的窗口句柄,第2个参数Msg是要发送消息的消息类型,第3个参数wParam和第4个参数lParam是消息的两个附加参数。第1个参数hWnd在前面已经介绍过了,该参数通过FindWindow()函数获取。
在程序的代码中,SendMessage()函数的第2个参数分别使用的了WM_CLOSE消息、WM_ SETTEXT消息和WM_GETTEXT消息。下面来看这3个消息的具体含义。
WM_CLOSE:将WM_CLOSE消息发送后,接收到该消息的窗口或应用程序将要关闭。WM_CLOSE消息没有需要的附加参数,因此wParam和lParam两个参数都为NULL。
WM_SETTEXT:应用程序发送WM_SETTEXT消息对窗口的文本进行设置。该消息需要附加参数,wParam参数未被使用,必须指定为0值,lParam参数是一个指向以NULL为结尾的字符串的指针。
WM_GETTEXT:应用程序发送WM_GETTEXT消息,将对应窗口的文本复制到调用者的缓冲区中。该消息也需要附加参数,wParam参数指定要复制的字符数数量,lParam是接收文本的缓冲区。
例子代码在VC6下进行编译连接,生成可执行文件后,可以通过按钮的提示进行测试,以便读者感性认识消息的作用。