借助Spy++向指定的窗口发送消息—3

来源:互联网 发布:matlab定积分计算编程 编辑:程序博客网 时间:2024/05/18 00:37

 在1,2部分我已经实现了向单词输入窗口中发送文本(单词),下面我要向翻译软件发送确认消息,相当于我点击“查询按

钮”。要发送点击按钮的消息,首先仍然是通过spy找到这个按钮窗口。将spy瞄准器拖放到确认按钮上。

 

点击确定按钮查看详细信息,可以看到该按钮窗口的控件ID。知道了控件的ID,就可以通过第2节中的方法来判断当前子窗体是否是要找的确认按钮,如果是确认按钮就可以用SendMessage向该窗口发送鼠标点击消息。

 

由于通过控件ID来确认窗口和第2节中的方法一样,所以这里我换成用控件在遍历中的索引来确认窗口。在继续之前请注意下确认窗口的窗口句柄(000206E6);

 

  1. int i=0; //控件的索引 
  2. BOOL CALLBACK EnumProc(HWND hwnd,LPARAM lParam)
  3. {
  4.     //定义两个字符数组,分别用来保存子窗口的句柄和索引 
  5.     char hdl[10],num[10];
  6.   
  7.     //将句柄和索引转换为字符 
  8.     itoa((int)(hwnd) ,hdl,16);
  9.     itoa(i ,num,10);
  10.          
  11.     //将转换后的字符数组再转换位字符串 
  12.     CString shdl=hdl;
  13.     CString snum=num;
  14.     //获得窗口上的ListBox句柄,ListBox用来显示句柄和对应的索引    
  15.     CWnd *p=((CWnd*)lParam)->GetDlgItem (IDC_LIST1);
  16.     ((CListBox*)p)->AddString (snum+":"+shdl);
  17.      //窗体索引自增 
  18.      i++;
  19.     
  20.     //后面的部分和第2节中的一样。 
  21.     int id=-1;  
  22.     id=::GetDlgCtrlID(hwnd);
  23.     if(id==0x69)
  24.     {       
  25.         ::SendMessage(hwnd,WM_SETTEXT,NULL,(LPARAM)("spy"));            
  26.     }   
  27.          
  28.     return TRUE;
  29. }

程序窗体:一个ListBox,一个Button

 

可以看到这里的句柄(206E6)在遍历子窗体的过程中,对应的索引号是9,虽然窗口的句柄在程序重启后可能是不同的,但是窗口在遍历过程的顺序是不变得,即每次遍历的过程中,确认窗口都是第10个找到的(索引基于0)。因此就可以通过这个索引来找到需要的窗体,然后做相应的事情。

 

这样我就可以在上面的回调函数中加上如下判断语句就可以实现鼠标点击效果了。

 

  1. int i=0; //控件的索引  
  2. BOOL CALLBACK EnumProc(HWND hwnd,LPARAM lParam)
  3. {
  4.     //定义两个字符数组,分别用来保存子窗口的句柄和索引  
  5.     char hdl[10],num[10];
  6.   
  7.          //将句柄和索引转换为字符  
  8.     itoa((int)(hwnd) ,hdl,16);
  9.     itoa(i ,num,10);
  10.          
  11.          //将转换后的字符数组再转换位字符串  
  12.     CString shdl=hdl;
  13.     CString snum=num;
  14.     //获得窗口上的ListBox句柄,ListBox用来显示句柄和对应的索引     
  15.     CWnd *p=((CWnd*)lParam)->GetDlgItem (IDC_LIST1);
  16.     ((CListBox*)p)->AddString (snum+":"+shdl);
  17.     //窗体索引自增  
  18.     i++;
  19.     
  20.     //后面的部分和第2节中的一样。  
  21.     int id=-1;  
  22.     id=::GetDlgCtrlID(hwnd);
  23.     if(id==0x69)
  24.     {       
  25.         ::SendMessage(hwnd,WM_SETTEXT,NULL,(LPARAM)("spy"));            
  26.     }  
  27.     //根据索引确定窗口
  28.     if(9==i) 
  29.     {
  30.      ::SendMessage(hwnd,WM_LBUTTONDOWN,NULL,0);  //发送鼠标按下消息
  31.      ::SendMessage(hwnd,WM_LBUTTONUP,NULL,0);    //发送鼠标左键弹起消息
  32.     }
  33.          
  34.     return TRUE;
  35. }

红色部分就是我根据索引判断窗口是否是确认窗口,并发送鼠标按下和弹体消息。

 

 

可以看到点击确认按钮后,翻译软件显示了网络翻译信息。