我的想法是:
1.获取被控程序的控件,发消息给改程序或模拟键盘/鼠标操作;
2.获取被控程序进程,模拟消息,注入消息循环给该程序;
3.修改被控程序的内存数据信息,达到控制该程序的目的;还有没有别的实现方法,哪种方法最优呀?

解决方案 »

  1.   

    将DLL注入到被控制程序的进程空间,可以玩转它的消息及内存。
    注入/挂接方法参考《Windows核心编程》第22章。
      

  2.   

    我的想法和做法(因为我曾经做过一个固定资产自动录入的东西:从原始的Excel表中读取数据填入一个固定资产管理软件中)是:
        一个应用软件基本上都是由人通过键盘或者鼠标来操作,而这两个操作都很容易通过程序来模拟:比如鼠标的移动,单击,双击,右击等,键盘的各状态键的状态,各按键的按下与抬起等.所以我在做上面提到的这个小程序的时候就是先分析其窗口在一定分辨率下最大化时各元素的位置(为鼠标移动作准备),分析各按键的顺序及规律(为模拟键盘作准备),然后通过程序模拟人操作这一过程就行了.  整个过程就像是人在操作一样,唯一不同的是速度快很多(因为程序模拟按键每秒可以几百次,而且是连续的),正确率几乎是100%.
        当然用其它办法也应该可以,但个人观点是:计算机的作用就是将复杂的问题变得尽可能简单,如果将原本就不是太复杂的东西,被计算机这个高科技的先进的东西给变得更复杂了,那计算机的存在也就没多少价值了.    个人观点仅供参考.
      

  3.   

    [email protected]
    给我发信,我给你发到信箱。
      

  4.   

    6、对系统中其他窗口的操作
    (1) SetFocus();//Dlg类中,窗口得到焦点
    CenterWindow();//Dlg类中,窗口居中 CWnd* pPrevWnd = CWnd::FindWindow(NULL,"CashFiesta"); //定位到某个窗口
    char strWin[80];
    pPrevWnd->GetWindowText(strWin,60);//得到窗口标题
    pPrevWnd->MessageBox (strWin);//显示得到的窗口标题 if (strcmp(strWin,"CashFiesta")==0)//如果窗口标题是 CashFiesta 则 //这个语句有问题改用下面一个
    if (pPrevWnd!=NULL)//如果确实有窗口标题是 CashFiesta的,则 pPrevWnd->MoveWindow(747,757,280,80,TRUE);//移动窗口到x=747,y=757, 宽度=280,高度=80,重绘
    pPrevWnd->SendMessage(WM_CLOSE);//关闭窗口 if (pPrevWnd->IsIconic())//如果窗口已经最小化
    pPrevWnd->ShowWindow(SW_RESTORE);//显示窗口,恢复 /* 依次得到所有窗口
    CWnd* pPrevWnd = CWnd::FindWindow(NULL,NULL);
    while (pPrevWnd)
    {
     pPrevWnd = pPrevWnd->GetWindow(GW_HWNDNEXT);
    }
    */
    (2) CWnd* pPrevWndL = CWnd::FindWindow(NULL,"CashFiesta Login");
    HWND handMain=::FindWindowEx(NULL,NULL,NULL,_T("CashFiesta Login"));这两个语句都是找到窗口 "CashFiesta Login",可以共存在一个代码段中,只是返回值的类型不同,便于不同应用,
    FindWindowEx也可以用于查找窗口中的控件,例如:
    HWND hwnd1=::FindWindowEx(handMain,NULL,_T("EditBar"),NULL);//查找定位到窗口 "CashFiesta Login"中的第一个EditBar控件(实际没有EditBar,只是用来说明如何取一个控件内部的控件)
    HWND hwnd2=::FindWindowEx(hwnd1,NULL,_T("Edit"),NULL);//查找定位到窗口 "CashFiesta Login"中的第一个EditBar控件中的EDIT控件16、向另外的程序窗口中的控件发消息 HWND handMain=::FindWindowEx(NULL,NULL,NULL,_T("CashFiesta Login"));//CashFiesta Login是其他程序的窗口标题
    if(handMain )//如果有那样的一个窗口打开
    {
    HWND hwndEdit=::FindWindowEx(handMain,NULL,_T("Edit"),NULL);
    HWND hwndButton=::FindWindowEx(handMain,NULL,_T("Button"),_T("OK"));
    if (hwndEdit)
    {
     char sz[255];
     strcpy(sz,"StevenMzq");
     ::SendMessage(hwnd2,WM_SETTEXT,255,(long)sz);//向Edit控件中加入字符串 StevenMzq
     ::SendMessage(hwnd2,WM_GETTEXT,255,(long)sz);//将Edit控件中的内容存入字符串 sz } if (hwndButton)
    {
    ::SendMessage(handMain,WM_COMMAND,1,(long)hwndButton);//模拟向button击键--重要!!
     char sz[255];
     strcpy(sz,"StevenMzq");
     ::SendMessage(hwnd2,WM_SETTEXT,255,(long)sz);//将Button控件的标题改为字符串 StevenMzq
     ::SendMessage(hwnd2,WM_GETTEXT,255,(long)sz);//将Button控件的标题存入字符串 sz }