Spy++原理初探

http://tech.ddvip.com   2007年09月02日    社区交流

内容摘要:用Visual Studio搞开发的朋友对Spy++这个工具一定不陌生,它可以分析窗体结构、进程和窗口消息,对开发工作有很大辅助作用。我们需要研究某个对象时,只要调出其查找窗口,拖动探测器的指针到指定窗口/控件上释放即可。下面,笔者就和大家一起,用VC打造一个属于自己的Spy++。

  第一个复选框是"总在最上面",代码如下:

void CSpyXXDlg::OnChktop()
{
  int nTop=((CButton*)GetDlgItem(IDC_CHKTOP))->GetCheck();
  if(nTop==1)
    :: SetWindowPos(m_hWnd,HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
  else
    ::SetWindowPos(m_hWnd,HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
}
  第二个复选框是"16进制"。因为其值影响到多个属性页对话框的内容,所以,也用一全局变量g_nHex保存之:void CSpyXXDlg::OnChkhex()
{
  g_nHex=((CButton*)GetDlgItem(IDC_CHKHEX))->GetCheck();
}
  这里,我们还建立了一个全局函数Display,来输出16进制和10进制时的句柄值:CString Display(int nVal)
{
  CString str;
  if(g_nHex==1)
  {
    str.Format("%x",nVal);
    str.MakeUpper();
  }
  else
    str.Format("%d",nVal);
  return str;
}
  三、选项卡控件

  选项卡控件中,5个标签页对应5个属性页对话框,与它们关联的类分别取名为CPage0、CPage1、CPage2、CPage3、CPage4。在CSpyXXDlg中建立私有成员变量m_page0、m_page1、m_page2、m_page3、m_page4。在其初始化过程中建立这5个属性页对话框:  m_page0.Create(IDD_OLE_PROPPAGE_LARGE,GetDlgItem(IDC_TAB1));
  m_page1.Create(IDD_OLE_PROPPAGE_LARGE1,GetDlgItem(IDC_TAB1));
  m_page2.Create(IDD_OLE_PROPPAGE_LARGE2,GetDlgItem(IDC_TAB1));
  m_page3.Create(IDD_OLE_PROPPAGE_LARGE3,GetDlgItem(IDC_TAB1));
  m_page4.Create(IDD_OLE_PROPPAGE_LARGE4,GetDlgItem(IDC_TAB1));
  CRect rs;
  m_tab.GetClientRect(rs);
  rs.top+=20;
  rs.bottom-=3;
  rs.left+=3;
  rs.right-=3;
  m_page0.MoveWindow(rs);
  m_page1.MoveWindow(rs);
  m_page2.MoveWindow(rs);
  m_page3.MoveWindow(rs);
  m_page4.MoveWindow(rs);
  m_page0.ShowWindow(SW_SHOW);
  m_tab.SetCurSel(0);
   然后在选项卡消息TCN_SELCHANGE响应函数中控制它们的显示:void CSpyXXDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
  // TODO: Add your control notification handler code here
  int i=m_tab.GetCurSel();
  switch(i)
  {
  case 0:
    m_page0.ShowWindow(SW_SHOW);
    m_page1.ShowWindow(SW_HIDE);
    m_page2.ShowWindow(SW_HIDE);
    m_page3.ShowWindow(SW_HIDE);
    m_page4.ShowWindow(SW_HIDE);
    break;
  case 1:
    m_page0.ShowWindow(SW_HIDE);
    m_page1.ShowWindow(SW_SHOW);
    m_page2.ShowWindow(SW_HIDE);
    m_page3.ShowWindow(SW_HIDE);
    m_page4.ShowWindow(SW_HIDE);
    break;
  case 2:
    ……
  default:
    ;
  }
  *pResult = 0;
}
  四、常规标签页

来源:vckbase    作者:宋陈三    责编:豆豆技术应用

正在加载评论...