C++ 黑客编程揭秘与防范(第3版)
上QQ阅读APP看书,第一时间看更新

1.1.1 对消息的演示测试

在真正学习和认识消息之前,先来完成一个简单的任务,看看消息能完成什么样的工作。首先写一个简单的程序,通过编写的程序发送消息来关闭记事本的进程、获取窗口的标题和设置窗口的标题。

程序的具体代码如下:

        void CMsgTestDlg::OnClose()
        {
          // 在此处添加处理程序代码
    HWND hWnd = ::FindWindow("Notepad", NULL);
    if ( hWnd == NULL )
    {
      AfxMessageBox("没有找到记事本");
      return ;
    }

    ::SendMessage(hWnd, WM_CLOSE, NULL, NULL);
  }

  void CMsgTestDlg::OnExec()
  {
    // 在此处添加处理程序代码
    WinExec("notepad.exe", SW_SHOW);
  }

  void CMsgTestDlg::OnEditWnd()
  {
      // 在此处添加处理程序代码
    HWND hWnd = ::FindWindow(NULL, "无标题 - 记事本");
    if ( hWnd == NULL )
    {
      AfxMessageBox("没有找到记事本");
      return ;
    }

    char *pCaptionText = "消息测试";
    ::SendMessage(hWnd, WM_SETTEXT, (WPARAM)0, (LPARAM)pCaptionText);
  }

  void CMsgTestDlg::OnGetWnd()
  {
        // 在此处添加处理程序代码
    HWND hWnd = ::FindWindow("Notepad", NULL);
    if ( hWnd == NULL )
    {
      AfxMessageBox("没有找到记事本");
      return ;
    }

    char pCaptionText[MAXBYTE] = { 0 };
    ::SendMessage(hWnd, WM_GETTEXT, (WPARAM)MAXBYTE, (LPARAM)pCaptionText);

    AfxMessageBox(pCaptionText);
  }

编写的代码中有4个函数:第1个函数OnClose()是用来关闭记事本程序的;第2个函数OnExec()是用来打开记事本程序的,主要是测试其他3个函数时可以方便地打开记事本程序;第3个函数OnEditWnd()是用来修改记事本标题的;第4个函数OnGetWnd()是用来获取当前记事本标题的。程序的界面如图1-1所示。

图1-1 消息测试窗口

简单测试一下这个程序。首先单击“打开记事本程序”按钮,出现记事本的窗口(表示记事本程序被打开了);接着单击“修改记事本标题”按钮,可以发现记事本程序的窗口标题改变了;再单击“获取记事本标题”按钮,弹出记事本程序窗口标题的一个对话框;最后单击“关闭记事本程序”按钮,记事本程序被关闭。