控制其它窗口控件VC篇

来源:互联网 发布:丁丁软件是什么情况 编辑:程序博客网 时间:2024/06/16 11:50
我写的程序非常简单,就是一个对话框程序,一个EditBox,当按下确定,能从指定的程序中的控件获得值。

      控制其它程序窗口控件,基本步骤为三步:1、得到窗口句柄。2、得到相应控件的句柄。3、向该句柄发送消息。

      第一步:得到窗口句柄,需要用的APIFindWindow。在MSDN中这个函数原型为static CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName )

第一个参数为窗口的类名,一般来说,我们不会知道要得到句柄窗口的类名,用NULL即可;第二个参数为窗口名称,这个应该很容易吧,看一看标题栏就知道了,但是对于标题栏变化的窗口就无能为力,留着以后研究吧。这里假设标题栏固定,是“source”。那么一下语句就能获得该窗口的句柄。

CWnd * pWnd;

pWnd = FindWindow ( NULL, “source” );

至此,第一步完成。

      第二步,第三步:获得该窗口的控件的句柄。我们用到的是EnumChildWindows和他的回调函数EnumChildProc,回调函数的名字可以自己随意了。我们现在在这个对话框类中添加一个回调函数,函数类型为BOOL CALLBACK,注意,一定要是静态的成员函数,有两个参数,HWND hwnd,      //目标窗口的句柄

LPARAM lParam   //用户自定义参数,改不改都行

然后为回调函数添加功能,他所完成的功能就是你想对要控制的控件作的动作,此处我们是要得到控件的值。

EnumChildProc(HWND Hwnd, LPARAM lParam)

{

       DWORD Result;

       CString s,sClassName;

       GetClassName(Hwnd,sClassName.GetBuffer(255),255);    //获得目标窗口控件的类型

       if(sClassName == "Edit")             //如果是EditBox,如果有多个EditBox,读到最后一个

       {

/*发送消息*/

       SendMessageTimeout(Hwnd,WM_GETTEXT,255,(LPARAM)s.GetBuffer(255),0,1000,&Result);

              sTmp = s;             //sTmp是我声明的一个全局静态变量,用来保存读到的数据

       }

       return TRUE;

}

回调函数写完了,下面写调用的函数,EnumChildWindows。总共有3个参数:

HWND hWndParent,         //目标窗口的句柄

WNDENUMPROC lpEnumFunc,  //回调函数的函数名

LPARAM lParam            //用户自定义参数

具体的我写的程序,调用方法为

EnumChildWindows(pWnd->m_hWnd, EnumChildProc, (LPARAM)this);

第三个参数如果没有用到,就这么写吧,我不太明白为什么,但是至少不会出错,我是菜鸟我怕谁。

注意,回调函数会遍历目标窗口所有的EditBox,你只能获得最后一个的值,关于这个问题,你需要知道对方窗口的控件TAB顺序,这个没有太好的办法,只能自己一个一个试验了。由于回调函数是一个静态函数,只能访问静态变量,所以你需要一个静态的全局变量来保存数据,比如我写的程序中就用到sTmp,然后随便写个函数,UpdateData(FALSE)。齐活。

      第三步:发送消息用APISendMessage或者SendMessageTimeout,以前者为例

LRESULT SendMessage(

  HWND hWnd,      //发送消息的控件句柄

  UINT Msg,       //发送的消息

  WPARAM wParam,  //消息的参数

  LPARAM lParam   //消息的第二个参数

);

比如如果MsgWM_GETTEXT,那么以后的2个参数为int类型的长度char *,但是第4个参数需要用强制类型转换为(LPARAM),否则会报错。

根据Msg的不同,以后的参数含义也不同,如果消息时WM_ENABLE,那么第三个参数就是BOOL类型的,第四个参数没用,就写NULL吧。